【问题标题】:How to use ActionListener when the button function is in another class当按钮功能在另一个类中时如何使用 ActionListener
【发布时间】:2014-10-17 14:26:53
【问题描述】:

我有三个不同的类:Main、WindowFrameDimetnions 和 ValidationOfNumbers。 Main – 调用 WindowFrameDimetnions。这是主要课程 WindowFrameDimetnions – 调用(我正在尝试调用)ValidationOfNumbers。这是为程序创建框架、窗格、框的标签和按钮的类。 ValidationOfNumbers – 是为数字验证进行所有计算的一种。基本上这个类会验证用户输入的数字是否在 1..100,000 的范围内。

目标: 目标是使用 ActionListener 将 WindowFrameDimetnions 与 ValidationOfNumbers 连接起来。

package BlueBlueMainFiles;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class WindowFrameDimentions extends JFrame{

    final static int WINDOW_WITH    = 950;//Window with in pixel
    final static int WINDOW_HEIGH   = 650;//Window height in pixel
    static JPanel       panel;//use to reference the panel
    static JLabel       messageLabel;//use to reference the label 
    static JTextField   textField;//use to reference the text field
    static JButton      calcButton;//use to reference the button 

    public WindowFrameDimentions() {
        // TODO Auto-generated constructor stub
    }

    public static void windowFrameDimentions(){
        //create a new window
        JFrame window = new JFrame();

        //add a name to the window
        window.setTitle("BLUE BLUE");

        //set the size of the window
        window.setSize(WINDOW_WITH, WINDOW_HEIGH);

        //specify what happens when the close button is pressed 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //BUILD THE PANEL AND ADD IT TO THE FRAME
        buildPanel();

        //ADD THE PANEL TO THE FRAMES CONTENT PANE
        window.add(panel);

        //Display the window
        window.setVisible(true);
    }

    public static void buildPanel(){
        //create a label to display instructions
        messageLabel = new JLabel("Enter a Number from 1..100,000");

        //create a text field of 10 characters wide
        textField = new JTextField(10);

        //create panel
        calcButton = new JButton("Calculate");


        //Add an action listening to the button. Currently, I can't make it work


        //Create the a JPanel object and let the panel field reference it
        panel = new JPanel();

        panel.add(messageLabel);
        panel.add(textField);
        panel.add(calcButton);

    }
}

现在这是另一个代码:

package TheValidationFiles;


public class  ValidationOfNumbers {

    static int MAX_NUMBER_TO_VAL = 10000000;

    public static void GetValidationOfNumbers(boolean isTrue, String s) {

             String[] numberArray = new String [MAX_NUMBER_TO_VAL];
             boolean numberMatching = false;

             for (int i = 0; i < MAX_NUMBER_TO_VAL; i++){
                     numberArray[i] = Integer.toString(i);

                     if (numberArray[i].equals(s)){
                         System.out.println("The number you typed " + s + " Matches with the array value of: " + numberArray[i]);
                         System.exit(0);
                         break;
                     }
                     else{
                         numberMatching = true;
                     }
             }
             if(numberMatching){
                 ValidationOfFiles.ValidationOfFiles(s);
             }
    }

}

【问题讨论】:

  • 我的回答来得有点晚,但是有兴趣了解如何链接UI和逻辑的人可以看看我下面的解决方案。

标签: java swing actionlistener connect


【解决方案1】:

你可以尝试做一个匿名的AbstractAction:

panel.add(new JButton(new AbstractAction("name of button") {
    public void actionPerformed(ActionEvent e) {
        //do stuff here
    }
}));

【讨论】:

  • 我收到以下错误:BlueBlueMainFiles.WindowFrameDimentions.buildPanel(WindowFrameDimentions.java:67) at BlueBlueMainFiles.WindowFrameDimentions.windowFrameDimentions(WindowFrameDimentions.java:45) 的线程“main”中的异常 java.lang.NullPointerException ) 在 BlueBlueMainFiles.BlueBlueTheMain.main(BlueBlueTheMain.java:20) 拿起 JAVA_TOOL_OPTIONS: -Djava.vendor="Sun Microsystems Inc."
【解决方案2】:

希望这应该可行..尝试将包TheValidationFiles导入WindowFrameDimentions

然后是actionlistener的代码

calcButton.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent ae){
     ValidationOfNumbers von=new ValidationOfNumbers();
     von.GetValidationOfNumbers(boolean value,string);
  }});

【讨论】:

    【解决方案3】:

    在我看来,您正在尝试实现类似 MVC 模式的东西。在这种情况下,

    • 您的验证类将被视为模型(逻辑和数据)
    • 您的 Frame 类充当视图(演示/用户界面)
    • 您的 Main 类充当 Cnotroller(模型和视图之间的中间人)

    请注意,模型和视图不应该知道彼此的存在。它们通过控制器进行通信。

    因此您的控制器(主类)应该包含视图(框架类)和模型(验证类)的引用:

    //Your controller
    public class MainClass{
        private WindowFrameDimentions view;
        private ValidationOfNumbers model;
    }
    

    现在是将 View 链接到 Controller 的关键部分: 因为你的视图不处理逻辑和实现,所以你不用直接在这个类中编写按钮的动作监听器的实现,而是添加一个接收ActionListener的方法:

    //The view
    public class WindowFrameDimentions{
        private JButton calcButton;
        private JTextField textField;    //please use a better name for this
    
        public WindowFrameDimentions(){
            //Initialize all other required attributes here..
            calcButton = new JButton("Calculate");
        }
    
        //The controller will create a listener and add to calcButton
        public void addCalcButtonListener(ActionListener listener){
            calcButton.addActionListener(listener)
        }
    
        //You need a getter for all the input fields such as your JTextFields
        public String getInput(){
            textField.getText();
        }
    }
    

    对于您的 Validation 类,它只是一个简单的验证方法,如下所示:

    //The model
    public class ValidationOfNumbers{
    
        public ValidationOfNumbers(){
            //Initialize all other required attributes here..
        }
    
        public boolean validationPassed(String input){
            //your validation code goes here..
        }
    }
    

    现在,将所有 3 个类链接在一起,您有:

    //The controller
    public class MainClass{
        private WindowFrameDimentions view;
        private ValidationOfNumbers model;
    
        public static void main(String[] args){
            view = new WindowFrameDimentions();
            model = new ValidationOfNumbers();
            view.addCalcButtonListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Now, we can use the Validation class here
                    if(model.validationPassed(view.getInput())){  //Linking Model to View
                        //If validation passes, do this
                    }
                    //Any other actions for calcButton will be coded here
                }
            });
        }
    }
    

    这是链接所有 3 个类的总体思路。通常,在实现 MVC 时我会有 4 个类而不是 3 个,另外还有 1 个类来驱动代码。但在本例中,我使用 Controller 类来驱动代码。

    另外请注意,您实际上应该扩展为 JPanel 而不是 JFrame,然后将扩展类的实例添加到 JFrame。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多