gpt4 book ai didi

java - 为什么我的 JFrame 不隐藏?

转载 作者:行者123 更新时间:2023-12-02 08:38:16 25 4
gpt4 key购买 nike

我正在 Netbeans 6.1 中为我的高级设计项目创建 GUI,但我遇到了一个恼人的障碍。当我告诉它时,临时窗口(例如我的登录弹出窗口和其他窗口)不会消失。我已经断断续续地研究了如何解决这个问题大约两个月了。我什至为我的弹出窗口设置了一个单独的线程,但它仍然无法工作......如果我确实不弄乱任何其他 GUI 组件,它就会消失的唯一方法......我的示例代码应该有助于描述我的愤怒...不要介意影子代码,它是为了测试目的,这显然没有帮助。

//This method is called once a user presses the "first" login button on the main GUI
public synchronized void loginPopUpThread() {
doHelloWorld = new Thread(){
@Override
public synchronized void run()
{
try
{
loginPopUpFrame.pack();
loginPopUpFrame.setVisible(true);
System.out.println("waitin");
doHelloWorld.wait();
System.out.println("Not Sleepin..");
loginPopUpFrame.pack();
loginPopUpFrame.setVisible(false);
}
catch (InterruptedException e)
{
}
}
};
doHelloWorld.start();

//This is called when the "second" loginB is pressed and the password is correct...
public synchronized void notifyPopUp() {
synchronized(doHelloWorld) {

doHelloWorld.notifyAll();
System.out.println("Notified");
}
}

我也尝试过 Swing Utilities,但也许我实现错误,因为这是我第一次使用它们。它本质上与上面的代码做了同样的事情,除了窗口在等待时卡住,而上面的代码没有这样做:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
public synchronized void run() {
try
{
loginPopUpFrame.pack();
loginPopUpFrame.setVisible(true);
System.out.println("waitin");
wait();
System.out.println("Not Sleepin.");
loginPopUpFrame.pack();
loginPopUpFrame.setVisible(false);
}
catch (InterruptedException e)
{
}
}
});

请帮助我!!!

最佳答案

经验法则:

  • 不要在任意线程中操作 GUI 组件;总是安排在事件线程中操作它们
  • 永远不要在事件线程内等待或 hibernate (因此,永远不要在发送到 invokeLater() 的代码内)

所以解决这个问题的答案是“其他方法”......

稍微从问题上退一步,您实际上想要做什么?如果您只是想要一个登录对话框等待用户输入用户名和密码,那么有吗这是不只使用模态 JDialog 的原因(毕竟,这就是它的用途......)。

如果您确实希望某个任意线程等待关闭窗口/操作 GUI 的信号,那么您需要在另一个线程中等待,然后进行该线程使用实际的 GUI 操作代码调用 SwingUtilities.invokeLater()。

附注实际上有一些 GUI 操作方法可以安全地从其他线程调用,例如“只是设置标签”的调用通常是安全的。但哪些调用是安全的并没有非常明确的定义,因此最好在实践中避免这个问题。

关于java - 为什么我的 JFrame 不隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com