简体   繁体   中英

How to use ActionListener when the button function is in another class

I have three different classes: Main, WindowFrameDimetnions, and ValidationOfNumbers. Main – Calls WindowFrameDimetnions. It is the main class WindowFrameDimetnions – Calls (well I am trying to call ) ValidationOfNumbers. This is the class that creates the frame for the program, the pane, the label for the box, and the button. ValidationOfNumbers – is the one that does all the calculations for number validations. Basically this class validates that the numbers typed by the use are within the range of 1..100,000.

Goal: The goal is to connect WindowFrameDimetnions with ValidationOfNumbers by using an ActionListener.

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

    }
}

Now this is the other code:

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

}

You can try to make an anonymous AbstractAction:

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

well hope this should work..try importing package TheValidationFiles into WindowFrameDimentions

then code for actionlistener

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

It seems to me you are trying to achieve something like a MVC pattern. In this case,

  • Your Validation class will be treated as the Model (logic and data)
  • Your Frame class acts as the View (presentation / user interface)
  • Your Main class acts as the Cnotroller (middleman betweem Model and View)

Note that Model and View should not know the existence of one another. They communicate via the Controller.

Hence your Controller (Main class) should hold a reference of View (Frame class) and Model (Validation class):

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

Now the crucial part to link View to your Controller: Because your view does not handle the logic and implementation, hence you don't code the implementation for button's action listener in this class directly, instead, just add a method to receive an 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();
    }
}

For your Validation class, it will be just a simple method to validate like this:

//The model
public class ValidationOfNumbers{

    public ValidationOfNumbers(){
        //Initialize all other required attributes here..
    }

    public boolean validationPassed(String input){
        //your validation code goes here..
    }
}

Now, linking all 3 classes together, you have:

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

This is the overall idea of linking all 3 classes. Normally, I would have 4 classes instead of 3 when implementing MVC, 1 more class to drive the codes. But in this example, I use Controller class to drive the codes.

Also note that, you should actually be extending to a JPanel instead of a JFrame, then add the instance of the extended class to the JFrame.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM