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)?
82
javax.swing.event
pakiecie . ;)Odpowiedzi:
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ć.
źródło
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
&JTextPane
w ograniczonym stopniu używając HTML w innychJComponents
. AWT nie obsługuje dokumentów ze stylami w żadnym komponencie.AWT nie zapewnia struktury opartej na drzewach
JTree
, żadnej struktury tabelarycznej, takiej jakJTable
brak wersjiJToolBar
.AWT nie ma odpowiednika (który mogę znaleźć lub przypomnieć) dla
JColorChooser
i żadnego dla prostej klasy użytkowej -JOptionPane
.Słuchacze
Jak wspomniano w komentarzu, zobacz ponad 20 dodatkowych / alternatywnych słuchaczy w
javax.swing.event
pakiecie.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:
BoxLayout
GroupLayout
OverlayLayout
ScrollPaneLayout
SpringLayout
ViewportLayout
Inny
UndoManager
do cofania / ponawiania w edytowalnych dokumentach.SwingWorker
dla responsywnych GUI.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.
źródło
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ę.
źródło
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); } }
źródło
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.
źródło