Słuchacze Java GUI bez AWT

82

Jestem początkującym programistą Java i uczę się z samouczków internetowych. Uczę się pełnoekranowych aplikacji GUI. Wczoraj powiedziano mi, że nie powinienem używać AWT w moich programach, ponieważ jest przestarzały. Wiem już o lekkich i ciężkich podzespołach, głównym problemem są słuchacze myszy i klawiatury. Dlaczego AWT jest nieaktualny? Jak zrobić program bez AWT (dodawanie słuchaczy do JComponents itp.) (Jakie rzeczy Swinga mogą zastąpić AWT)?

Hidde
źródło
Nigdy nie słyszałem o słuchaczach innych niż AWT. Byłoby miło wiedzieć to sam.
LouwHopley
3
@Nideo: rozkoszuj się ponad 20 słuchaczami w javax.swing.eventpakiecie . ;)
Andrew Thompson
@ Andrew, dzięki! : P Czy jest powód, by raczej używać słuchaczy swing niż AWT?
LouwHopley

Odpowiedzi:

43

Błędnie interpretujesz podane informacje. Należy unikać używania komponentów Swing z komponentami AWT . Można używać Swinga ze strukturą nasłuchiwania AWT, menedżerami układu itp. I właściwie nie można tego nie robić.

Poduszkowiec pełen węgorzy
źródło
36

Było kilka dobrych odpowiedzi, ale chciałbym poruszyć nieco inny aspekt. Rzeczy, które Swing zapewnia poza AWT.

składniki

Swing obsługuje stylizowane dokumenty w JEditorPane& JTextPanew ograniczonym stopniu używając HTML w innych JComponents. AWT nie obsługuje dokumentów ze stylami w żadnym komponencie.

AWT nie zapewnia struktury opartej na drzewach JTree, żadnej struktury tabelarycznej, takiej jak JTablebrak wersji JToolBar.

AWT nie ma odpowiednika (który mogę znaleźć lub przypomnieć) dla JColorChooseri żadnego dla prostej klasy użytkowej - JOptionPane.

Słuchacze

Jak wspomniano w komentarzu, zobacz ponad 20 dodatkowych / alternatywnych słuchaczy w javax.swing.eventpakiecie.

Podłączany wygląd i styl

Komponenty Swing można ustawić na określony wygląd i zachowanie w czasie wykonywania, w tym natywny PLAF.

Zobacz zrzuty ekranu w przykładzie zagnieżdżonego układu, aby uzyskać więcej przykładów.

Układy

Oprócz mnóstwa układów AWT, Swing zapewnia:

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

Inny


Prawdopodobnie w tym krótkim opisie przegapiłem o wiele więcej, ale najważniejsze jest to, że Swing to zupełnie nowszy i bardziej aktywny zestaw narzędzi GUI.

Swing opiera się na klasach AWT i bardzo na nich polega.

Andrew Thompson
źródło
7

Java's Swing pobiera ActionListeners, które są częścią pakietu AWT. Jeśli chcesz używać swing, musisz użyć jakiejś formy AWT ActionListener. Tak jest po prostu. W ogóle nie sugeruję używania Javy do złożonych GUI, ale nie powiedziałbym też, że AWT jest przestarzały, ponieważ nie ma bezpośredniego zamiennika. Dlatego po prostu śmiało i używaj AWT.

Alternatywnie możesz zajrzeć do JOGL, ale to więcej, jeśli próbujesz stworzyć coś zorientowanego na grę.

MirroredFate
źródło
2

To jest mały przykład, który może zademonstrować, użycie pakietu javax.swing.Action Powinieneś również zapoznać się z dokumentem java dla pakietu 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);
    }
}
Harshit Thacker
źródło
1

Masz rację. Zarówno Java AWT, jak i Java Spring są przestarzałe. Zamiast tego użyj JavaFX.
I jako komentarz, jestem sfrustrowany Javą, że miała to być „pisz raz uruchomiona wszędzie”, a teraz okazuje się, że „musi ciągle przepisywać aplikację co trzy miesiące”, ponieważ nowe wydania Javy psują poprzedni kod, a nowe pakiety zastępują stare.

Baruch Atta
źródło