Java GUI Listener ohne AWT

81

Ich bin ein beginnender Java-Entwickler und lerne nur aus Internet-Tutorials. Ich lerne Vollbild-GUI-Anwendungen. Mir wurde gestern gesagt, dass ich AWT nicht in meinen Programmen verwenden sollte, da es veraltet ist. Ich kenne mich bereits mit leichten und schweren Komponenten aus. Das Hauptproblem sind die Maus- und Tastaturhörer. Warum ist AWT veraltet? Wie erstelle ich ein Programm ohne AWT (Hinzufügen von Listenern zu JComponents usw.) (welche Art von Swing-Dingen kann das AWT ersetzen)?

Versteckt
quelle
Ich habe noch nie von anderen Zuhörern als AWT gehört. Wäre schön es selbst zu wissen.
LouwHopley
3
@Nideo: Genießen Sie die über 20 Hörer im javax.swing.eventPaket . ;)
Andrew Thompson
@ Andrew, danke! : P Gibt es einen Grund, lieber Swing-Listener als AWT-Listener zu verwenden?
LouwHopley

Antworten:

43

Sie interpretieren die Ihnen gegebenen Informationen falsch. Sie sollten die Verwendung von Swing-Komponenten mit AWT- Komponenten vermeiden . Es ist in Ordnung, Swing mit der AWT-Listener-Struktur, Layout-Managern usw. zu verwenden, und tatsächlich ist es unmöglich, dies nicht zu tun.

Luftkissenfahrzeug voller Aale
quelle
34

Es gab einige gute Antworten, aber ich möchte einen etwas anderen Aspekt behandeln. Dinge, die Swing jenseits von AWT bietet.

Komponenten

Swing unterstützt gestaltete Dokumente in JEditorPane& JTextPane& in begrenztem Umfang mit HTML in anderen JComponents. AWT unterstützt keine gestalteten Dokumente in Komponenten.

AWT bietet keine baumbasierte Struktur wie JTree, keine tabellarische Struktur wie JTable, keine Version von JToolBar.

AWT hat kein Äquivalent (das ich finden oder zurückrufen kann) für JColorChooser& keines für die einfache Utility-Klasse - JOptionPane.

Zuhörer

Wie in einem Kommentar erwähnt, finden Sie mehr als 20 zusätzliche / alternative Listener im javax.swing.eventPaket.

Steckbares Look & Feel

Swing-Komponenten können zur Laufzeit auf ein bestimmtes Erscheinungsbild eingestellt werden, einschließlich eines nativen PLAF.

Weitere Beispiele finden Sie in den Screenshots im Beispiel für verschachtelte Layouts .

Layouts

Zusätzlich zu der Fülle von AWT-Layouts bietet Swing:

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

Andere


Es gibt wahrscheinlich noch viel mehr, was ich in dieser kurzen Beschreibung verpasst habe, aber unter dem Strich ist Swing ein insgesamt neueres und leistungsfähigeres GUI-Toolkit.

Swing baut auf Klassen in der AWT auf und verlässt sich stark darauf.

Andrew Thompson
quelle
7

Javas Swing verwendet ActionListener, die Teil des AWT-Pakets sind. Wenn Sie Swing verwenden möchten, müssen Sie eine Art AWT ActionListener verwenden. So sind die Dinge eben. Ich schlage nicht vor, Java für komplexe Guis zu verwenden, aber ich würde auch nicht sagen, dass AWT veraltet ist, da es keinen direkten Ersatz gibt. Also einfach weitermachen und AWT verwenden.

Alternativ können Sie sich JOGL ansehen, aber das ist mehr, wenn Sie versuchen, etwas Spielorientiertes zu erstellen.

MirroredFate
quelle
2

Dies ist ein kleines Beispiel, das die Verwendung des Pakets javax.swing.Action demonstrieren kann. Sie sollten sich auch auf das Java-Dokument für das Paket javax.swing.event beziehen. Ich denke, Sie finden das. . .

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
quelle
0

Du hast recht. Sowohl Java AWT als auch Java Spring sind veraltet. Verwenden Sie stattdessen JavaFX.
Und als Kommentar bin ich frustriert über Java, dass es "einmal überall schreiben" sein sollte, wenn sich nun herausstellt, dass "Ihre App alle drei Monate neu geschrieben werden muss", weil neue Java-Versionen den vorherigen Code beschädigen. und neue Pakete ersetzen die alten.

Baruch Atta
quelle