如何使用Java的Swing库和ActionEvent

时间:2019-11-27 09:15:11

标签: java swing

我正在自学如何在Swing中使用Java的图形UI,目前正在制作简单的计算器。但是,我在应用程序上实现+,-和清除按钮时遇到问题。

在介绍我的代码之前,我想指出的是,我省略了工作正常且与当前问题无关的部分。

我还想指出,我的程序有单独的软件包“ calculator.applicationlogic”,其中包含接口NumberMath及其实现CalculateNumberNumberMathCalculateNumber用于记录数字,因此它所做的只是返回当前数字,将当前数字加到当前数字,从当前数字中减去并通过设置为0清除记录的数字。

以下是实现UI的文件:

// GraphicCalculator.java
package calculator.ui;

import calculator.applicationlogic.*;
import calculator.ui.*;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JButton;


public class GraphicCalculator implements Runnable{
    private JFrame frame;
    private NumberMath num;

    public GraphicCalculator(NumberMath num){
        this.num = num;
    };

    @Override
    public void run(){
      ... config for how windows look ...
    }

    // displays output and input
    private void createComponents(Container container){
        GridLayout layout = new GridLayout(3, 1);   
        container.setLayout(layout);

        JTextField output = new JTextField("0");
        output.setEnabled(false);
        JTextField input = new JTextField();

        container.add(output);
        container.add(input);
        container.add(createPanel(input, output));
    }

    // Button that has +, -, and clear (clear denoted with letter Z)
    private JPanel createPanel(JTextField in, JTextField out){
        JPanel panel = new JPanel(new GridLayout(1,3));

        // create buttons
        JButton addButton = new JButton("+");
        JButton subButton = new JButton("-");
        JButton clearButton = new JButton("Z");

        // Action
        CalculateListener listener = new CalculateListener(this.num, in, out);
        addButton.addActionListener(listener); 
        subButton.addActionListener(listener); 
        clearButton.addActionListener(listener); 

        // add buttons to panel
        panel.add(addButton);
        panel.add(subButton);
        panel.add(clearButton);

        return panel;
    }

    public JFrame getFrame(){
        return frame;
    }

}

以下是EventListener,它对按钮执行操作:

// CalculateListener.java
package calculator.ui;

import calculator.applicationlogic.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.JButton;

public class CalculateListener implements ActionListener{

    private NumberMath value;
    private JTextField input;
    private JTextField output;

    public CalculateListener(NumberMath value, JTextField input, JTextField output){
        this.value = value;
        this.input = input; 
        this.output = output;   
    }

    @Override
    public void actionPerformed(ActionEvent ae){

        if(ae.getSource().getClass().equals(JButton.class)){
            String userInput = this.input.getText();    
            int inputValue = Integer.parseInt(userInput);

            JButton buttonPressed = (JButton)ae.getSource();    

            // add
            // ****** buttonPressed.getName() returns Null, which is causing program to crash ******//
            if(buttonPressed.getName().equals("+")){
                this.value.addNum(inputValue);  
            }

            // sub
            if(buttonPressed.getName().equals("-")){
                this.value.subNum(inputValue);  
            }

            // clear
            if(buttonPressed.getName().equals("Z")){
                this.value.clearNum();  
            }

            this.output.setText(String.valueOf(this.value.getNum()));
            this.input.setText("");
        }
        else{
            System.err.println("No Button");
        }
    }
}

由于我遇到了ActionEvent无法识别按钮名称的问题,因此我引用了this post来确定其他按钮。在编译时,由于在获取ae.getSource()的名称时出现“ null”,因此一旦在计算器中输入数字,程序就会崩溃。下面是我的程序的外观和崩溃结果:

enter image description here

在上面的示例中,在输入字段中输入数字2并按“ +”按钮后,程序崩溃。我想知道是否有人可以指导我说明为什么buttonPressed.getName()上的CalculateListener.java返回空值以及如何解决此问题。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

只需更改

buttonPressed.getName().equals("+")

buttonPressed.getText().equals("+")

然后再做一次检查。