Java JButton在显示JOptionPane后保持按下状态
好的,很抱歉,我重复已经问过的问题,但我一直在搜索,搜索,搜索,没有人的答案似乎对我有帮助。。。我尝试了以下问题: 如果我只是装傻,我向你道歉。。很难与我的代码联系起来 我已经尝试了一切:使用另一个线程来处理所有的东西,将JFrame更改为JDialog,因为它们显然是模态的,所以它可以独立工作。但这似乎也不起作用。我现在卡住了,所以我正在使用上一个资源请求堆栈溢出 我试图做的是让用户在文本字段4,2,7中输入一些数字,然后他们按JButton Calculate Mean,它会找到这些数字的平均值,并将其显示在JOptionPane消息中。当用户关闭JOptionPane对话框时,他们应该能够编辑数字并再次执行此操作,但“计算平均值”按钮仍处于按下状态,用户除了关闭窗口外,什么也不能做。即使按Tab键也不会改变任何事情。有人知道这是为什么吗?我的代码如下: 如果我的代码很难读,请原谅我!我花了很长时间试着把它缩进正确的位置,我也试着把与问题无关的部分去掉,使它尽可能短。我不确定要取出哪些碎片,所以可能还有一些不必要的碎片。。。 很抱歉,我的代码混乱,但这是代码:Java JButton在显示JOptionPane后保持按下状态,java,swing,jbutton,Java,Swing,Jbutton,好的,很抱歉,我重复已经问过的问题,但我一直在搜索,搜索,搜索,没有人的答案似乎对我有帮助。。。我尝试了以下问题: 如果我只是装傻,我向你道歉。。很难与我的代码联系起来 我已经尝试了一切:使用另一个线程来处理所有的东西,将JFrame更改为JDialog,因为它们显然是模态的,所以它可以独立工作。但这似乎也不起作用。我现在卡住了,所以我正在使用上一个资源请求堆栈溢出 我试图做的是让用户在文本字段4,2,7中输入一些数字,然后他们按JButton Calculate Mean,它会找到这些数字的平
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方法上使用synchronized。代码在事件分派线程EDT上执行,因此它将是单线程的。
不要使用线程。在EDT上睡觉。这将阻止GUI重新绘制自身。
在calculateMean中,您正在设置calculate.setEnabledfalse;-你在哪里启用这个?Bhaskar是对的你禁用了你的按钮计算。要启用它,请选择calculate.setEnabledtrue@Bhaskar我认为setEnabled方法会改变按钮是否被按下,所以我将其设置为false,认为这意味着它不会被按下。这不对吗?我是不是搞错了?setEnabledfalse将在您的文字中以按下模式禁用按钮-请阅读文档并尝试不同的方法。这就是学习的方法。@Bhaskar谢谢你!!!你真的解决了我的问题!!:对不起,我照你说的做了,但是现在对话框关闭时按钮变白了。最初它是蓝色的,但仍然不活动,现在它是白色的,不活动。你知道还有什么不对劲的吗?谢谢你的回答:没关系。我想你确实帮了我,但我本该说setEnabledtrue的时候,我正在打电话给setEnabledfalse,现在它开始工作了!