将JTextField中输入的值传递给ActionListener

时间:2018-04-09 19:18:43

标签: java jframe

GUI目的:

用户应该能够在数字字段中输入一个数字,然后单击方形按钮。单击按钮后,程序将计算输入数字的平方,并将其显示在Square字段中。

我的问题: 我究竟如何传递输入的数字以在ActionListener类中使用?

#eceeef

2 个答案:

答案 0 :(得分:0)

这里有几个选项:

  • 如果您希望操作类是一个单独的类,则将NumberFieldSquare字段都传递到bhandler's类构造函数中;
  • 您还可以将ActionListener实现为ButtonDemo类的内部类。在这种情况下,您可以访问父类私有字段;
  • 我最喜欢的定义动作侦听器的方法是使用Java 8 Lambdas。以下是添加此类动作侦听器的方法:

SquareButton.addActionListener(e -> this::handleSquareButtonClicked);

然后将以下方法添加到ButtonDemo类:

private void handleSquareButtonClicked(ActionEvent event)
{
       <your event handling coded here.>
}

以下是使用lambdas的代码的工作示例:

package examples;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class ButtonDemo extends JFrame 
{
    private JButton squareButton;
    private JButton resetButton;
    private JLabel numberLabel;
    private JLabel squareLabel;

    private JTextField numberField;
    private  JTextField squareField;


    public ButtonDemo()
    {

        Container container=getContentPane();
        container.setLayout(new FlowLayout());

        Panel panel1= new Panel();
        Panel panel2= new Panel();
        Panel panel3 = new Panel();
        panel1.setLayout(new FlowLayout());

        squareButton = new  JButton("Square");
        resetButton = new  JButton("Reset");

        numberLabel = new JLabel("Number");
        squareLabel = new JLabel("Square");

        numberField = new JTextField();
        numberField.setColumns(8);

        squareField = new JTextField();
        squareField.setColumns(8);

        panel3.add(panel1);
        panel3.add(panel2);

        panel1.add(numberLabel);
        panel1.add(squareLabel);
        panel1.add(numberField);
        panel1.add(squareField);

        panel2.add(squareButton);
        panel2.add(resetButton);

        container.add(panel1);
        container.add(panel2);
        container.add(panel3);

        squareButton.addActionListener(e -> handleSquareButtonClick(e));
        resetButton.addActionListener(e -> handleresetButtonClick(e));

        setSize(500,500);
        setVisible(true);
    }

    private void handleresetButtonClick(ActionEvent e) 
    {
        this.numberField.setText(null);
        this.squareField.setText(null);
    }

    private void handleSquareButtonClick(ActionEvent e)
    {
        try
        {
            double number = Double.parseDouble(this.numberField.getText());
            this.squareField.setText(String.valueOf(number * number));
        }
        catch (NumberFormatException ex)
        {
            System.out.println(ex.getMessage());
        }

    }

    public static void main(String args[])
    {
        ButtonDemo application = new ButtonDemo();
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}//end of  class Buttondemo

请注意,我已重命名一些变量以遵守Java命名约定。

答案 1 :(得分:0)

在用于附加侦听器的ButtonDemo构造函数中,不需要将侦听器附加到文本字段,只是对于这样的按钮:

SquareButton.addActionListener(new bhandler1(Integer.valueOf(NumberField.getText())));

在处理程序类中添加一个像这样的构造函数

private class bhandler implements ActionListener
    {
        int userIput ;
        public bhandler(int userInput){
             this.userInput = userInput ;
        }

        public void actionPerformed(ActionEvent event)
        {
            if(event.getSource() == SquareButton)
            {
                // Do what ever you want with userInput 
            }

        }

    }