java - jOption消息未关闭

标签 java swing while-loop joptionpane

您好,如果这是一个愚蠢的问题,我深表歉意,但我正在努力找出为什么我的 JoptionPane 消息没有关闭。我想使用嵌套控制结构来计算用户执行的计算量。

我认为这与我如何计数或如何测试是否满足处理计算器框架的条件有关(我将要发生一件新的事情,但是现在我只是想让整个事情结束)

package ac.uk.valley.forth;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;



import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JOptionPane;

public class Calculator extends JFrame {

protected static final String operatorButton = null;
private JPanel contentPane;
private JTextField textField;
private double total = 0.0;
private double actualTotal = 0.0;
private char operator;
public int counter = 0;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Calculator frame = new Calculator();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Calculator() {

    setTitle("Calculator");
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 291, 330);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.CENTER);
    panel.setLayout(null);

    textField = new JTextField();
    textField.setBounds(0, 37, 275, 85);
    panel.add(textField);
    textField.setColumns(10);

    JButton button_10 = new JButton("7");
    button_10.setBounds(5, 157, 44, 23);
    button_10.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("7"));
        }
    });
    panel.add(button_10);

    JButton button_11 = new JButton("8");
    button_11.setBounds(55, 157, 44, 23);
    button_11.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("8"));
        }
    });
    panel.add(button_11);

    JButton button_12 = new JButton("9");
    button_12.setBounds(109, 157, 44, 23);
    button_12.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("9"));
        }
    });
    panel.add(button_12);

    JButton btnOff = new JButton("OFF");
    btnOff.setBounds(158, 157, 61, 23);
    btnOff.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            // setVisible(false);
            // dispose();

        }
    });
    panel.add(btnOff);

    JButton button_4 = new JButton("4");
    button_4.setBounds(5, 185, 44, 23);
    button_4.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("4"));
        }
    });
    panel.add(button_4);

    JButton button_5 = new JButton("5");
    button_5.setBounds(55, 185, 44, 23);
    button_5.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("5"));
        }
    });
    panel.add(button_5);

    JButton button_6 = new JButton("6");
    button_6.setBounds(109, 185, 44, 23);
    button_6.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("6"));
        }
    });
    panel.add(button_6);

    JButton button = new JButton("1");
    button.setBounds(5, 213, 44, 23);
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("1"));
        }
    });
    panel.add(button);

    JButton button_1 = new JButton("2");
    button_1.setBounds(55, 213, 44, 23);
    button_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("2"));
        }
    });
    panel.add(button_1);

    JButton button_2 = new JButton("3");
    button_2.setBounds(109, 213, 44, 23);
    button_2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("3"));
        }
    });
    panel.add(button_2);

    JButton button_13 = new JButton("0");
    button_13.setBounds(5, 240, 44, 23);
    button_13.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            textField.setText(textField.getText().concat("0"));

        }
    });
    panel.add(button_13);

    JButton button_14 = new JButton(".");
    button_14.setBounds(56, 241, 44, 23);
    button_14.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            textField.setText(textField.getText().concat("."));

        }
    });
    panel.add(button_14);

    JButton btnCe_1 = new JButton("CE");
    btnCe_1.setBounds(109, 240, 53, 23);
    btnCe_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            textField.setText("");
        }
    });
    panel.add(btnCe_1);

    JButton equalsButton = new JButton("=");
    equalsButton.setBounds(166, 212, 53, 51);
    equalsButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            Calculate();

        }
    });
    panel.add(equalsButton);

    final JButton subtractionButton = new JButton("-");
    subtractionButton.setBounds(221, 213, 44, 23);
    subtractionButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // textField.setText(textField.getText().concat("-"));

            String operatorText = subtractionButton.getText();
            getOperator(operatorText);

        }
    });
    panel.add(subtractionButton);

    final JButton moduloButton = new JButton("%");
    moduloButton.setBounds(221, 157, 44, 23);
    moduloButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // textField.setText(textField.getText().concat("%"));
            String operatorText = moduloButton.getText();
            getOperator(operatorText);

        }
    });
    panel.add(moduloButton);

    final JButton multiplicationButton = new JButton("*");
    multiplicationButton.setBounds(167, 185, 44, 23);
    multiplicationButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // textField.setText(textField.getText().concat("*"));

            String operatorText = multiplicationButton.getText();
            getOperator(operatorText);

        }
    });

    panel.add(multiplicationButton);

    final JButton divideButton = new JButton("/");
    divideButton.setBounds(221, 185, 44, 23);
    divideButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // textField.setText(textField.getText().concat("/"));

            String operatorText = divideButton.getText();
            getOperator(operatorText);
        }
    });
    panel.add(divideButton);

    final JButton additionButton = new JButton("+");
    additionButton.setBounds(221, 240, 44, 23);
    additionButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            String operatorText = additionButton.getText();
            getOperator(operatorText);

        }
    });
    panel.add(additionButton);
}

private void getOperator(String operatorButton) {

    operator = operatorButton.charAt(0);
    total = total + Double.parseDouble(textField.getText());
    textField.setText("");

}

public void Calculate() {

    switch (operator) {
    case '+':

        actualTotal = total + Double.parseDouble(textField.getText());

        break;

    case '-':
        actualTotal = total - Double.parseDouble(textField.getText());

        break;
    case '/':
        actualTotal = total / Double.parseDouble(textField.getText());

        break;
    case '*':
        actualTotal = total * Double.parseDouble(textField.getText());

        break;
    case '%':
        actualTotal = total % Double.parseDouble(textField.getText());

        break;

    }

    textField.setText(Double.toString(actualTotal));
    total = 0;
    counter++;
    other(counter);

}

public void other(int counter) {

    boolean onGoing = true;
    String infoMessage = Integer.toString(counter);

    do

    {

        JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + "Calculations Performed",
                JOptionPane.INFORMATION_MESSAGE);
        JOptionPane.getRootFrame().dispose();

        if (counter > 2)

        {

            onGoing = false;
            setVisible(false);

        }
    } while (onGoing == true);

}

}

最佳答案

您有一个 while (true) block 完全踩踏 Swing 事件线程并阻止 JOptionPane 关闭:

while (onGoing == true);

解决办法:去掉它;您不需要它,因为这是一个事件驱动的程序。而是将该代码放入您的事件(您的 ActionListeners)中。

一些旁白:

  • 虽然 null 布局和 setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单、最好的方法,但您创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整组件的大小,它们是增强或维护的皇家女巫,当放置在滚动 Pane 中时,它们会完全失败,在所有平台或与原始分辨率不同的屏幕分辨率上查看时,它们看起来非常糟糕.
  • 使用数组和 ArrayList 以及 for 循环来缩短大部分代码,从而更轻松地编码和调试。

关于java - jOption消息未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580853/

相关文章:

java - 单击事件 - 从另一个类访问 boolean 变量

java - while循环只在deleteMax()堆方法中执行一次

循环数组卡在 if 语句中

linux - 脚本中的 'if' 语句出现问题

Java正则表达式格式字符串

java - RxJava。 Observable.OnSubscribe 无法解析为类型

java - 如何在java swing中使用socket显示通知

java - 如何从 JFrame 2 检索 JFrame 1 中设置的类字段

java - 为什么不需要通过配置公开 JavaMailSender 即可 Autowiring ,Spring Boot 1.5.8

java - 来自 Android 相机的图像,正面朝上