【问题标题】:Java Architecture - Question about ActionListener ConventionsJava 架构 - 关于 ActionListener 约定的问题
【发布时间】:2010-12-23 21:10:52
【问题描述】:

我正在制作一个显示图形和操作图形的用户界面。该类扩展了 JFrame 实现了 ActionListener。 ActionListener 然后根据动作调用不同的类来操作图形。这在该类几乎没有 ActionListener 的情况下有效;但是,现在班级变得难以管理。

我知道,为了封装,最好在用户界面类中包含 ActionListener,因为它需要访问界面的非静态组件。但是,封装性和可读性之间似乎存在冲突。

我的建议是将类分解为一个用于接口的类和一个用于 ActionListener 的类,并静态访问接口组件。我想知道的是这是否遵循基本的设计约定?而且,如果这是一种可接受的方法,您会将主类放在用户界面类还是 ActionListener 类中?

【问题讨论】:

    标签: java swing architecture conventions


    【解决方案1】:

    Not a duplicate question... but my answer should help with your question.

    简短的总结一下,我的偏好是让 JFrame 类不实现 ActionListener,然后让一些命名的内部类与 JFrame 一起实现 ActionListener。

    我会将 main 放在一个单独的类中......并称它为 Main。

    下面是一些我喜欢的示例代码:

    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    
    public class Main
    {
        private Main()
        {
        }
    
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    
        private static void createAndShowGUI()
        {
            final FooFrame frame;
    
            frame = new FooFrame();
            frame.setupGUI();
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    

    然后是图形用户界面:

    import java.awt.FlowLayout;
    import java.awt.LayoutManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    
    public class FooFrame
        extends JFrame
    {
        private final JButton incrementBtn;
        private final JButton decrementBtn;
        private int value;
    
        {
            incrementBtn = new JButton("++");
            decrementBtn = new JButton("--");
        }
    
        private class IncrementListener
            implements ActionListener
        {
    
            public void actionPerformed(final ActionEvent evt)
            {
                increment();
            }
    
        }
    
        private class DecrementListener
            implements ActionListener
        {
    
            public void actionPerformed(final ActionEvent evt)
            {
                decrement();
            }
    
        }
    
        public void setupGUI()
        {
            final LayoutManager layout;
    
            layout = new FlowLayout();
            setLayout(layout);
            setupListeners();
            addComponents();
        }
    
        private void setupListeners()
        {
            incrementBtn.addActionListener(new IncrementListener());
            decrementBtn.addActionListener(new DecrementListener());
        }
    
        private void addComponents()
        {
            add(incrementBtn);
            add(decrementBtn);
        }
    
        private void increment()
        {
            value++;
            System.out.println("value = " + value);
        }
    
        private void decrement()
        {
            value--;
            System.out.println("value = " + value);
        }
    }
    

    【讨论】:

    • 很好的答案,但在我接受这个答案之前,请确保我理解。您的建议是 JFrame 和 Actionlistener 类都实现了 actionlistener。并且 JFrame 对其进行解释并将其传递给 ActionListener 进行处理?
    • 给我一点,我会放一些代码 :-) (只需要开始工作......考试时间:-)
    • 非常感谢,非常感谢。
    猜你喜欢
    • 2011-05-10
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多