Слухачі графічного інтерфейсу Java без AWT


82

Я початковий розробник Java, навчаюся лише на підручниках з Інтернету. Я вивчаю повноекранні графічні програми. Вчора мені сказали, що я не повинен використовувати AWT у своїх програмах, оскільки він застарів. Я вже знаю про легкі та важкі компоненти, головна проблема - це прослуховувачі миші та клавіатури. Чому AWT застарів? Як створити програму без AWT (додавання слухачів до JComponents тощо) (які речі Swing можуть замінити AWT)?


Я ніколи не чув про інших слухачів, крім AWT. Було б непогано це знати самому.
LouwHopley

3
@Nideo: Поласуйте своїми "вухами" для 20+ слухачів у javax.swing.eventпакеті . ;)
Ендрю Томпсон,

@Andrew, дякую! : P Чи є причина скоріше використовувати прослуховувачі swing, ніж прослуховувачі AWT?
LouwHopley

Відповіді:


43

Ви неправильно інтерпретуєте надану вам інформацію. Ви повинні уникати використання компонентів Swing , AWT з компонентами . Нормально використовувати Swing зі структурою слухача AWT, менеджерами компонування тощо, і насправді це неможливо не робити.


36

Було кілька хороших відповідей, але я хотів би висвітлити дещо інший аспект. Речі, які Swing пропонує поза AWT.

Компоненти

Swing підтримує стилізовані документи в JEditorPane& JTextPane& обмежено, використовуючи HTML в деяких інших JComponents. AWT не підтримує стилізовані документи жодного компонента.

AWT не надає деревної структури на зразок JTree, жодної табличної структури, наприклад JTable, жодної версії JToolBar.

AWT не має еквівалента (якого я можу знайти або згадати) для JColorChooser& жодного для простого класу корисності - JOptionPane.

Слухачі

Як зазначалося в коментарі, див. 20+ додаткових / альтернативних слухачів у javax.swing.eventпакеті.

Знімний зовнішній вигляд

Компоненти гойдалки можна налаштувати на певний зовнішній вигляд під час роботи, включаючи власний PLAF.

Перегляньте знімки екрана на прикладі вкладеного макета, щоб отримати ще кілька зразків.

Макети

На додаток до безлічі макетів AWT, Swing пропонує:

  1. BoxLayout
  2. GroupLayout
  3. OverlayLayout
  4. ScrollPaneLayout
  5. SpringLayout
  6. ViewportLayout

Інший


Напевно, у цьому короткому описі я пропустив багато іншого, але суть полягає в тому, що Swing - це набагато новіший та більш увімкнений інструментарій графічного інтерфейсу.

Свінг обидва базується на класах AWT і покладається на них.


7

Java Swing приймає ActionListeners, які є частиною пакету AWT. Якщо ви хочете використовувати гойдалки, ви повинні використовувати певну форму AWT ActionListener. Це саме так. Я не пропоную взагалі використовувати Java для складних графічних інтерфейсів, але я б також не сказав, що AWT застарів, оскільки прямої заміни немає. Таким чином, просто використовуйте AWT.

Як альтернативу, ви можете розглянути JOGL, але це більше, якщо ви намагаєтесь створити щось орієнтоване на гру.


2

Це невеликий приклад, який можна продемонструвати, як використовувати пакет javax.swing.Action, ви також повинні звернутися до документації Java для пакета javax.swing.event, я думаю, ви знайдете це. . .

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;

class SysOutHelloAction extends AbstractAction {
    private static final Icon printIcon = new ImageIcon("Print.gif");

    SysOutHelloAction() {
        super("Print", printIcon);
        putValue(Action.SHORT_DESCRIPTION, "Hello, World");
    }

    public void actionPerformed(ActionEvent actionEvent) {
        System.out.println("Hello, World");
    }
}

public class SwingActionTester {
    public static void main(String args[]) {
        JFrame frame = new JFrame("Action Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final Action printAction = new SysOutHelloAction();
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("File");
        menuBar.add(menu);
        menu.add(new JMenuItem(printAction));
        JToolBar toolbar = new JToolBar();
        toolbar.add(new JButton(printAction));
        JButton enableButton = new JButton("Enable");
        ActionListener enableActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.setEnabled(true);
            }
        };
        enableButton.addActionListener(enableActionListener);
        JButton disableButton = new JButton("Disable");
        ActionListener disableActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.setEnabled(false);
            }
        };
        disableButton.addActionListener(disableActionListener);
        JButton relabelButton = new JButton("Relabel");
        ActionListener relabelActionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                printAction.putValue(Action.NAME, "Changed Action Value");
            }
        };
        relabelButton.addActionListener(relabelActionListener);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(enableButton);
        buttonPanel.add(disableButton);
        buttonPanel.add(relabelButton);
        frame.setJMenuBar(menuBar);
        frame.add(toolbar, BorderLayout.SOUTH);
        frame.add(buttonPanel, BorderLayout.NORTH);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

1

Ти правий. І Java AWT, і Java Spring застарілі. Замість цього використовуйте JavaFX.
І, як коментар, я розчарований Javaю, що це повинно було бути "писати один раз, щоб запустити скрізь", а тепер виявляється "потрібно продовжувати переписувати свій додаток кожні три місяці", оскільки нові випуски Java порушують попередній код, а нові пакети замінюють старі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.