代码之家  ›  专栏  ›  技术社区  ›  mahmoudalsof

将JTextField中输入的值传递给ActionListener

  •  0
  • mahmoudalsof  · 技术社区  · 7 年前

    GUI用途:

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

    我的问题: 如何准确地传递输入的要在ActionListener类中使用的数字?

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.event.ActionListener;
    
    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);
    
            bhandler bhandler1 = new bhandler();
    
            SquareButton.addActionListener(bhandler1);
            ResetButton.addActionListener(bhandler1);
    
            SquareField.addActionListener(bhandler1);
            NumberField.addActionListener(bhandler1);
    
            setSize(500,500);
            setVisible(true);
        }
    
        public static void main(String args[])
        {
            ButtonDemo application = new ButtonDemo();
            application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        private class bhandler implements ActionListener
        {
    
            public void actionPerformed(ActionEvent event)
            {
                if(event.getSource() == SquareButton)
                {
    
                }
    
            }
    
        }
    }//end of  class Buttondemo
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Anatoliy Pidlubnyy    7 年前

    您在这里有几个选项:

    • 如果希望action类是一个单独的类,那么将 NumberField 以及 Square 字段输入到 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命名约定。

        2
  •  0
  •   Mohammad    7 年前

    在用于附加监听器的ButtonDemo构造函数中,不需要将监听器附加到文本字段,仅针对如下按钮:

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

    在handler类中添加如下构造函数

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