Java Swing invokeLater()方法不工作
在我的主摆动框架中,我有以下方法:Java Swing invokeLater()方法不工作,java,swing,netbeans,Java,Swing,Netbeans,在我的主摆动框架中,我有以下方法: public void receiveCommand(String command) { if (command.equals("enable")) { Runnable enable = new Runnable() { public void run() { button1.setEnabled(true);
public void receiveCommand(String command) {
if (command.equals("enable")) {
Runnable enable = new Runnable() {
public void run() {
button1.setEnabled(true);
button1.revalidate();
button1.repaint();
}
};
SwingUtilities.invokeLater(enable);
}
基本上,我试图通过调用receiveCommand()方法从外部更新GUI(启用按钮button1)
但是,这不起作用,即按钮1仍处于禁用状态。我做错了什么
编辑:
以下是按钮1的声明:
private javax.swing.JButton button1;
button1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
button1.setEnabled(false);
button1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
button1ActionPerformed(evt);
}
});
按钮1和receiveCommand方法都在这个游戏类中:
public class Game extends javax.swing.JFrame
该方法是从另一个类调用的:
gameUI.receiveCommand("enable"); //gameUI is a Game object
编辑2:感谢您的帮助!结果证明它毕竟是一个错误的引用,所以我所做的只是试图更新一个错误框架的GUI,该框架尚未设置为可见。愚蠢的我所以不管怎样,这是有效的
public class TestInvokeLater {
public static void main(String[] args) {
new TestInvokeLater();
}
public TestInvokeLater() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setBorder(new EmptyBorder(12, 12, 12, 12));
final JButton runMe = new JButton("Run me");
runMe.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
runMe.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
runMe.setEnabled(true);
}
});
}
}).start();
}
});
setLayout(new GridBagLayout());
add(runMe);
}
}
}
“不起作用”告诉我们的很少。你能详细说明一下吗?请提供更多信息以继续?是否确定正在执行
if
语句中的代码块?也许可以尝试使用命令。equalsIgnoreCase(“启用”)
替代?我忘了添加:按钮1仍然是disabled@MadProgrammer我敢肯定它在ifAll中,我可以非常自信地说:问题不在您显示的代码中。我看到的唯一错误是不必要的重新验证和重新绘制调用。据我们所知,您可能在错误的引用上调用了setEnabled(…)
,但同样,您没有向我们显示任何允许我们提供帮助的内容。为什么要尝试使其容器无效并重新绘制?应该没有必要调用这些方法中的任何一个。@Robin我同意,但我见过很多情况下,通过这样做“这不应该需要做”可以解决,但您的示例不是那种奇怪的情况。。。因此,杂乱无章可能会把没有经验的人引向错误的方向