【问题标题】:JOptionpane.showMessageDialog not working inside of if-statement (event handler Program)JOptionpane.showMessageDialog 在 if 语句(事件处理程序)中不起作用
【发布时间】:2017-09-05 13:21:13
【问题描述】:

上下文

我正在尝试使用 JFrame事件处理 构建一个百分比计算器,方法是使用空白文本字段和“输入”按钮并显示答案取决于他们单击的按钮(每个按钮有两种不同的计算)。

问题

问题是,当我将 JOptionPane.showMessageDialog 行放入 if/else if 语句(全部在 actionPerformed 方法中)时,程序运行,但单击按钮没有任何作用。但如果我把它放在语句之外,它会说 answer 变量未声明

我意识到百分比计算器可以用一百万种其他更简单的方法来完成,但这只是我的想法,并想看看我是否可以做到(我是一个完全的初学者)。

代码

public class PercentageCalc extends JFrame{
private JTextField item2, item4, item5, item7;
private JButton button, button2;

public PercentageCalc(){
    super("Percentage Calculator");
    setLayout(new FlowLayout());

    JLabel item1 = new JLabel("What is");
    add(item1);

    JTextField item2 = new JTextField(3);
    add(item2);

    JLabel item3 = new JLabel("% of");
    add(item3);

    JTextField item4 = new JTextField(2);
    add(item4);
    button = new JButton("Enter");
    add(button);
    JLabel spacer = new JLabel("                       ");
    add(spacer);

    JTextField item5 = new JTextField(3);
    add(item5);

    JLabel item6 = new JLabel("is what % of");
    add(item6);

    JTextField item7 = new JTextField(3);
    add(item7);
    button2 = new JButton("Enter");
    add(button2);


    thehandler handler = new thehandler();
    button.addActionListener(handler);
    button2.addActionListener(handler); 
}
private class thehandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        String strx;
        String stry;
        double x, y, answer;
        if(e.getSource()==button){
            strx = item2.getText();
            stry = item4.getText();
            x = Double.parseDouble(strx);
            y = Double.parseDouble(stry);
            answer = y * 0.01 * x;
            JOptionPane.showMessageDialog(null, answer);
        }
            else if(e.getSource()==button2){
            strx = item5.getText();
            stry = item7.getText();
            x = Double.parseDouble(strx);
            y = Double.parseDouble(stry);
            answer = x/y*100;
            JOptionPane.showMessageDialog(null, answer);
            }
}

【问题讨论】:

标签: java swing if-statement jframe joptionpane


【解决方案1】:

您有同名的成员变量和局部变量。请阅读erehere 了解它。

这是你程序的更正变体

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class PrecentageCalc extends JFrame {
    private JTextField item2, item4, item5, item7;

    private JButton button, button2;

    public PrecentageCalc() {
        super("Percentage Calculator");
        setLayout(new FlowLayout());

        JLabel item1 = new JLabel("What is");
        add(item1);

        item2 = new JTextField(3);
        add(item2);

        JLabel item3 = new JLabel("% of");
        add(item3);

        item4 = new JTextField(2);
        add(item4);
        button = new JButton("Enter");
        add(button);
        JLabel spacer = new JLabel("                       ");
        add(spacer);

        item5 = new JTextField(3);
        add(item5);

        JLabel item6 = new JLabel("is what % of");
        add(item6);

        item7 = new JTextField(3);
        add(item7);
        button2 = new JButton("Enter");
        add(button2);

        thehandler handler = new thehandler();
        button.addActionListener(handler);
        button2.addActionListener(handler);
    }

    private class thehandler implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String strx;
            String stry;
            double x, y, answer;
            if (e.getSource() == button) {
                strx = item2.getText();
                stry = item4.getText();
                x = Double.parseDouble(strx);
                y = Double.parseDouble(stry);
                answer = y * 0.01 * x;
                JOptionPane.showMessageDialog(null, answer);
            } else if (e.getSource() == button2) {
                strx = item5.getText();
                stry = item7.getText();
                x = Double.parseDouble(strx);
                y = Double.parseDouble(stry);
                answer = x / y * 100;
                JOptionPane.showMessageDialog(null, answer);
            }
        }
    }

    public static void main(String[] args) {
        JFrame frm = new PrecentageCalc();
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }
}

【讨论】:

  • 进行这些更改会导致错误:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 在我单击按钮时出现(尽管程序仍在编译和运行)。
  • 我只是编辑了原始帖子并发布了整个代码(减去导入的东西和 main 方法,这并不相关)。
  • 谢谢!感谢您的帮助 :) 另外,感谢您的链接。
【解决方案2】:

为您的按钮使用单独的 ActionListener。两者使用相同的计算方法,但参数不同:

public PercentageCalc() { 

  // Part of your code   

  button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
      handleInput(item2.getText(), item4.getText());
    }
  });

  button2.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
      handleInput(item5.getText(), item7.getText());
    }
  });

}

private void handleInput(final String strx, final String stry) {
  final double x = Double.parseDouble(strx);
  final double y = Double.parseDouble(stry);
  final double answer = y * 0.01 * x;
  JOptionPane.showMessageDialog(null, answer);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多