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 обеспечивает:
-
BoxLayout
-
GroupLayout
-
OverlayLayout
-
ScrollPaneLayout
-
SpringLayout
-
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 прерывают предыдущий код, и новые пакеты заменяют старые.