不使用 AWT 的 Swing GUI 侦听器

我是一个刚起步的 Java 开发人员,只是从互联网教程中学习。我正在学习全屏 GUI 应用程序。我昨天被告知不应该在我的程序中使用 AWT,因为它已经过时了。我已经知道了关于轻量级和重量级组件,主要问题是鼠标和键盘侦听器。 为什么 AWT 过时了?

如何制作一个没有 AWT 的程序(将侦听器添加到 JComponent等) ?什么样的 Swing 东西可以取代 AWT?

5926 次浏览

Java's Swing takes ActionListeners, which are part of the AWT package. If you wish to use swing, you must use some form of an AWT ActionListener. That is just the way things are. I don't suggest using Java at all for complex guis, but nor would I say that AWT is outdated, as there is no direct replacement. Thus, just go ahead and use AWT.

As an alternative, you could look into JOGL, but that's more if you are trying to create something game-oriented.

You're mis-interpreting the information given to you. You should avoid using Swing components with AWT components. It's OK to use Swing with the AWT listener structure, layout managers, etc. and in fact it's impossible not to.

There have been some good answers, but I would like to cover a slightly different aspect. Things that Swing provides beyond AWT.

Components

Swing supports styled documents in JEditorPane & JTextPane & to a limited extent using HTML in some other JComponents. AWT does not support styled documents in any component.

AWT provides no tree based structure like JTree, no tabular structure such as JTable, no version of JToolBar.

AWT has no equivalent (that I can find or recall) for JColorChooser & none for the simple utility class - JOptionPane.

Listeners

As mentioned in a comment, see the 20+ extra/alternate listeners in the javax.swing.event package.

Pluggable Look & Feel

Swing components can be set to a particular look & feel at run-time, including a native PLAF.

See the screen shots on the Nested Layout Example for some more samples.

Layouts

In addition to the plethora of AWT layouts, Swing provides:

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

Other


There is probably a lot more I missed in that brief description, but the bottom line is that Swing is an altogether newer and more enabled GUI toolkit.

Swing both builds on, and relies heavily on, classes in the AWT.

This is a small example which can demonstrate, the use of javax.swing.Action package you should also refer to java doc for javax.swing.event package i think you are finding that . . .

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);
}
}

You are right. Both Java AWT and Java Spring are obsolete. Use JavaFX instead.
And, as a commentary, I am frustrated with Java, that it was supposed to be "write once run everywhere", when now it turns out to be "must keep rewriting your app every three months" because new Java releases break previous code, and new packages replace the old.