Java GUI-слушатели без AWT

Я начинаю Java-разработчик, изучая только из интернет-уроков. Я изучаю полноэкранные графические приложения. Вчера мне сказали, что я не должен использовать AWT в своих программах, потому что он устарел. Я уже знаю о легких и тяжеловесных компонентах, главная проблема – слушатели мыши и клавиатуры. Почему AWT устарел? Как сделать программу без AWT (добавление слушателей в JComponents и т. Д.) (Какие вещи Swing могут заменить AWT)?

Вы неправильно интерпретируете предоставленную вам информацию. Вам следует избегать использования компонентов Swing с компонентами AWT. Вполне нормально использовать Swing со структурой прослушивания AWT, менеджерами макетов и т. Д., И на самом деле это невозможно.

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

Компоненты

Swing поддерживает оформленные документы в JEditorPane & JTextPane и в ограниченной степени использует HTML в некоторых других JComponents . AWT не поддерживает оформленные документы в любом компоненте.

AWT не поддерживает структуру JTree , такую ​​как JTable , не имеет табличной структуры, такой как JTable , без версии JToolBar .

AWT не имеет эквивалента (который я могу найти или вспомнить) для JColorChooser & none для простого classа утилиты – JOptionPane .

Слушатели

Как упоминалось в комментарии, см. 20+ дополнительных / альтернативных слушателей в пакете javax.swing.event .

Вставной взгляд и ощущение

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

См. Скриншоты в примере вложенного макета для некоторых других образцов.

Макеты

В дополнение к множеству макетов AWT, Swing обеспечивает:

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

Другие

  • Ключевые привязки. Подробнее см. Как использовать привязки клавиш .
  • UndoManager для отмены / повторного использования в редактируемых документах.
  • Встроенная двойная буферизация, чтобы избежать мерцания при перерисовке.
  • SwingWorker для SwingWorker графических интерфейсов.

В этом кратком описании, вероятно, гораздо больше я пропустил, но суть в том, что Swing – это совсем новый и расширенный инструментарий GUI.

Качели оба строят дальше и в значительной степени зависят от classов в AWT.

Java Swing использует ActionListeners, которые являются частью пакета AWT. Если вы хотите использовать swing, вы должны использовать какую-либо форму AWT ActionListener. Это все так. Я не предлагаю использовать Java вообще для сложных guis, но я бы не сказал, что AWT устарел, поскольку нет прямой замены. Таким образом, просто продолжайте использовать AWT.

В качестве альтернативы вы могли бы изучить JOGL, но это больше, если вы пытаетесь создать что-то ориентированное на игры.

Это небольшой пример, который может продемонстрировать, использование пакета javax.swing.Action вы также должны обратиться к java doc для пакета 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); } } 

Ты прав. Как Java AWT, так и Java Spring устарели. Вместо этого используйте JavaFX.
И, как комментарий, я расстроен Java, что он должен был «писать раз подряд везде», когда теперь оказывается, что «нужно постоянно переписывать приложение каждые три месяца», потому что новые выпуски Java прерывают предыдущий код, и новые пакеты заменяют старые.

Давайте будем гением компьютера.