【问题标题】:JButton stays pressed after a JOptionPane is displayed显示 JOptionPane 后 JButton 保持按下状态
【发布时间】:2014-05-03 20:06:32
【问题描述】:

好的,很抱歉,我重复了已经提出的问题,但是我搜索了又搜索了又搜索,似乎没有人的答案对我有帮助...我尝试了以下问题:

JButton "stay pressed" after click in Java Applet

JButton stays pressed when focus stolen by JOptionPane

(如果我只是愚蠢的话,我很抱歉......很难与我的代码联系起来)

我已经尝试了一切:使用另一个线程来处理所有东西,将 JFrame 更改为JDialog,因为它们显然是“模态的”,因此它可以独立工作。但这似乎也不起作用。我现在卡住了,所以我正在使用我的最后一个资源(询问 Stack Overflow)。

我想要做的是让用户在文本字段(4,2,7)中输入一些数字,然后他们按JButton“计算平均值”,它会找到数字的平均值并将其显示在JOptionPane 消息。当用户关闭JOptionPane 对话框时,他们应该能够编辑数字并再次执行此操作,但“计算平均值”按钮保持按下状态,用户只能关闭窗口。即使按 Tab 键也不会改变任何内容。有人知道为什么是这样吗?我的代码如下:

如果我的代码难以阅读,请原谅我!我花了很长时间试图正确缩进,我还尝试通过删除与问题无关的任何部分来使其尽可能短。我不确定要取出哪些位,所以仍然可能有一些不必要的位... 我很抱歉我的代码乱七八糟,但这是代码:

package MathsProgram_II;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;

public class Mean implements Runnable {
    JFrame meanFrame = new JFrame(); //I tried changing this to dialog
    JPanel meanPanel = new JPanel(new GridBagLayout());
    JLabel enterNums = new JLabel("Enter Numbers: ");
    JTextField txtNums = new JTextField(20);
    JButton calculate = new JButton("Calculate Mean");

    boolean valid = true;
    double answer = 0;
    ButtonListener bl = new ButtonListener();


    public synchronized double[] getArray() {
        String nums = txtNums.getText();
        String[] numsArray = nums.split(",");
        double[] doubleArray = new double[numsArray.length];
        if (nums.isEmpty() == true) {
            JOptionPane.showMessageDialog(meanFrame, "You did not enter     anything!",
                    "Fail", JOptionPane.ERROR_MESSAGE);

            valid = false;
            calculate.setEnabled(false);
        } else {
            for (int i = 0; i < numsArray.length; i++) {
                try {
                    doubleArray[i] = Double.parseDouble(numsArray[i]);
                } catch (NumberFormatException nfe) {
                    JOptionPane.showMessageDialog(meanFrame, "Error getting numbers!",
                            "Error", JOptionPane.ERROR_MESSAGE);
                    valid = false;
                }
            }
        }
        return doubleArray;
    }


    public synchronized void calculateMean() {
        ArrayList<Double> numbersList = new ArrayList<Double>(20);
        double[] theNumbers = getArray();
        double tempAnswer = 0;
        if (valid == true) {
            int length = theNumbers.length;
            for (int i = 0; i < theNumbers.length; i++) {
                numbersList.add(theNumbers[i]);
            }
            for (int i = 0; i < length; i++) {
                double y = numbersList.get(i);
                tempAnswer = tempAnswer + y;
            }
            this.answer = tempAnswer / length;
            //I ALSO TRIED DOING THIS:
            txtNums.requestFocus();
            calculate.setEnabled(false);

            showMean();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }

        }

    }

    public void showMean() {
        JOptionPane.showMessageDialog(meanFrame, "The Mean: " + answer, "The Mean of      Your Numbers", JOptionPane.INFORMATION_MESSAGE);
    }

    private class ButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == calculate) {
                meanFrame.remove(meanPanel);
                meanFrame.setVisible(true);
                calculateMean();
            }

        }

    }
}

【问题讨论】:

  • 在您的calculateMean() 中设置calculate.setEnabled(false); - 您在哪里重新启用此功能?
  • Bhaskar 是对的,您禁用了按钮计算。启用它 calculate.setEnabled(true);
  • @Bhaskar 我认为 setEnabled 方法会改变按钮是否被按下,所以我将其设置为 false,认为这意味着它不会被按下。这不正确吗?我是不是搞错了?
  • setEnabled(false) 将禁用按钮(用你的话来说是按下模式) - 请阅读文档并尝试不同的方法。这就是学习的方式。
  • @Bhaskar 谢谢!!!你真的解决了我的问题!! :D

标签: java swing jbutton


【解决方案1】:
  1. 不要从您的主机上移除面板。
  2. 不要在“calculateMean()”方法中使用“同步”。代码在事件调度线程 (EDT) 上执行,因此它将是单线程的。
  3. 不要在 EDT 上使用 Thread.sleep()。这将防止 GUI 重新绘制自身。

【讨论】:

  • 对不起,我按照你说的做了,但是现在对话框关闭时按钮变白了。最初它是蓝色的但仍然不活跃,现在它是白色且不活跃。你知道还有什么可能是错的吗?不过谢谢你的回答:)
  • 没关系。我认为您确实帮助了我,但是当我应该说 setEnabled(true) 时我调用了 setEnabled(false) 现在它正在工作!
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2013-01-27
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多