没有AWT的Java GUI侦听器


81

我是一名Java开发人员,只是从Internet教程中学习。我正在学习全屏GUI应用程序。昨天有人告诉我,我不应该在程序中使用AWT,因为它已经过时了。我已经了解轻便和重量级的组件,主要问题是鼠标和键盘侦听器。为什么AWT过时了?如何在不使用AWT的情况下制作程序(向JComponents等添加侦听器)(什么样的Swing东西可以代替AWT)?


除了AWT,我从未听过其他听众。我本人会很高兴的。
LouwHopley 2011年

3
@Nideo:在javax.swing.event程序包中的20个以上的听众中饱餐一顿。;)
Andrew Thompson

@安德鲁,谢谢!:P是否有理由宁愿使用摇摆侦听器而不是AWT侦听器?
LouwHopley 2011年

Answers:


43

您误解了提供给您的信息。您应该避免将Swing组件与AWT组件一起使用。可以将Swing与AWT侦听器结构,布局管理器等一起使用,实际上是不可能的。


34

有一些很好的答案,但是我想介绍一个稍有不同的方面。Swing提供的功能超出了AWT。

组件

Swing在某些程度上使用HTML支持在JEditorPane&&中JTextPane使用样式化文档JComponents。AWT在任何组件中都不支持样式化文档。

AWT提供了一样,没有基于树的结构JTree,没有表结构,例如JTable,没有版本的JToolBar

JColorChooser对于简单实用程序类- ,AWT没有等效项(我可以找到或调用),也没有等效项JOptionPane

听众

如评论中所述,请参阅javax.swing.event软件包中的20多个额外/替代侦听器。

可插入的外观

可以在运行时将Swing组件设置为特定的外观,包括本地PLAF。

有关更多示例,请参见“嵌套布局示例”上的屏幕截图。

版面

除了过多的AWT布局,Swing还提供:

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

其他


在简短的描述中,我可能会错过很多东西,但是最重要的是,Swing是一个全新的,功能更强大的GUI工具包。

Swing都建立在AWT的类上,并且在很大程度上依赖于它们。


7

Java的Swing需要ActionListeners,它是AWT包的一部分。如果希望使用swing,则必须使用某种形式的AWT ActionListener。事情就是这样。我不建议对复杂的GUI完全使用Java,但是我也不会说AWT已过时,因为没有直接替换。因此,只需继续使用AWT。

作为替代方案,您可以研究JOGL,但如果您尝试创建面向游戏的产品,那就更多了。


2

这是一个小例子,可以演示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);
    }
}

0

你是对的。Java AWT和Java Spring均已过时。请改用JavaFX。
而且,作为评论,我对Java感到沮丧,因为它应该“编写一次到处运行”,而现在事实证明它是“必须每三个月重写一次应用程序”,因为新的Java版本破坏了先前的代码,新的软件包取代了旧的软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.