【问题标题】:Java GUI listeners without AWT没有 AWT 的 Java GUI 侦听器
【发布时间】:2023-03-24 09:23:01
【问题描述】:

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

【问题讨论】:

  • 我从未听说过 AWT 以外的听众。自己知道就好了。
  • @Nideo:在javax.swing.event package 的 20 多位听众中大饱眼福。 ;)
  • @Andrew,谢谢! :P 有理由宁愿使用摇摆监听器而不是 AWT 监听器吗?

标签: java swing layout awt listener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    组件

    Swing 支持 JEditorPane & JTextPane & 在有限的范围内使用 HTML 在其他一些 JComponents 中的样式文档。 AWT 不支持任何组件中的样式化文档。

    AWT 没有提供像 JTree 这样的基于树的结构,没有像 JTable 这样的表格结构,没有 JToolBar 的版本。

    AWT 对于JColorChooser 没有等价物(我可以找到或回忆),而对于简单实用程序类 - JOptionPane 也没有。

    听众

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

    可插拔的外观和感觉

    Swing 组件可以在运行时设置为特定的外观和感觉,包括原生 PLAF。

    更多示例请参见Nested Layout Example 上的屏幕截图。

    布局

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

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

    其他


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

    Swing 建立在都依赖于 AWT 中的类。

    【讨论】:

      【解决方案3】:

      Java 的 Swing 采用 ActionListener,它们是 AWT 包的一部分。如果你想使用swing,你必须使用某种形式的AWT ActionListener。事情就是这样。我完全不建议对复杂的 gui 使用 Java,但我也不会说 AWT 已经过时,因为没有直接的替代品。因此,请继续使用 AWT。

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

      【讨论】:

        【解决方案4】:

        这是一个可以演示的小例子,javax.swing.Action包的使用 您还应该参考 javax.swing.event 包的 java 文档,我认为您正在找到它。 . .

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

        【讨论】:

          【解决方案5】:

          你是对的。 Java AWT 和 Java Spring 都已过时。请改用 JavaFX。
          而且,作为评论,我对 Java 感到沮丧,因为它应该是“一次编写,到处运行”,而现在结果是“必须每三个月重写一次你的应用程序”,因为新的 Java 版本破坏了以前的代码,并且新包替换旧包。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-17
            • 1970-01-01
            • 2021-03-02
            • 2013-01-22
            • 2011-10-27
            • 2013-03-09
            • 2020-05-20
            • 1970-01-01
            相关资源
            最近更新 更多