代码之家  ›  专栏  ›  技术社区  ›  Ivan Horňák

Java:按钮封装

  •  0
  • Ivan Horňák  · 技术社区  · 7 年前

    所以我试图实现的是将ActionListener添加到另一个类中定义的按钮,而不破坏这个按钮的封装。

    我的GUI类:

    public class GUI extends JFrame {  
    
        private JButton button; 
    
        public GUI () { 
            this.button = new JButton ();
        }
    
        public void setText (Text text) {
            this.button.setText (text);
        }
    
        public JButton getButton () {
            return this.button;
        }    
    }
    

    我的游戏类:

    public class Game { 
    
        private GUI gui;  
    
        public Game () {
            this.gui = new GUI ();
            this.gui.getButton ().addActionListener (new ActionListener () {
                public void actionPerformed (ActionEvent evt) {
                    play ();                       
                }
            });  
        }
    
        public void play () {
            this.gui.setText ("Play");
        }
    }
    

    然后我在主类中调用一个新的游戏实例。

    我想去掉GUI类中的getter,否则使用一个或多个类似的文本setter是没有意义的。

    当我将ActionListener添加到GUI构造函数时,我只能访问游戏方法。有没有我看不到的解决方案?

    2 回复  |  直到 7 年前
        1
  •  2
  •   markspace    7 年前

    通常,当我这样做时,我会添加一个描述视图(GUI)的界面,然后让视图实现该界面。

    public interface MyView {
        void addActionListener( ActionListener l );
    }
    

    以及观点:

    public class GameGui implements MyView {
       // lots o' stuff
    
        public void addActionListener( ActionListener l ) {
           button.addActionListener( l );
        }
    }
    

    然后,您的主代码不依赖于您实际实现的视图类型。

    public class Main {
        public static void main( String... args ) {
           SwingUtils.invokeLater( Main::startGui );
        }
    
        public static void startGui() {
           MyView gui = new GameGui();
           gui.addActionListener( ... );
        }
    }
    

    不要忘记Swing不是线程安全的,必须在EDT上调用。

        2
  •  0
  •   luk2302    7 年前

    GUI Game 创建动作侦听器:

    public class GUI extends JFrame { 
    
        public void addActionListenerToButton(ActionListener listener) {
            button.addActionListener(listener);
        }
    
        ....
    
    }
    
    public class Game { 
    
        private GUI gui;  
    
        public Game () {
            this.gui = new GUI ();
            this.gui.addActionListenerToButton (new ActionListener () {
                public void actionPerformed (ActionEvent evt) {
                    play ();                       
                }
            });  
        }
    
        ...
    }
    

    或者,只传递一个功能接口,而不是完全构建的接口 ActionListener .