gpt4 book ai didi

java - 含有不可见内容的导致 sleep 的框架

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

我有一个带有菜单栏菜单的框架,当我选择一个菜单项时,我希望程序显示一条消息,然后几秒钟后(通过 sleep 功能)自动关闭该消息。

但我收到的是空消息(带有不可见内容的 jdialog):

enter image description here

如果删除关闭消息,其内容将在 sleep 时间后出现。

我需要更改什么才能获得正确的结果?

我想得到这个:

enter image description here

完整的工作代码:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.util.concurrent.TimeUnit;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class MessageSleepTest extends JDialog {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Frame("frame with menubar");
}
});
}
}

class Message extends JDialog {

public Message() {
this.setLayout(new GridLayout(0, 1));
this.add(new JLabel("Displaying this message for 3 seconds and then closing it...", JLabel.CENTER));

this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
}

class Frame extends JFrame{

public Frame(String title){

super(title);
setJMenuBar(new MenuBar());
setPreferredSize(new Dimension(500, 300));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null); // center the frame
setVisible(true);

}

}

class MenuBar extends JMenuBar implements ActionListener{
public static JMenuItem itmOpen;

public MenuBar() {
JMenu menuFile = new JMenu("File");

itmOpen = new JMenuItem("Open...");
itmOpen.addActionListener(this);

add(menuFile);
menuFile.add(itmOpen);
}

@Override
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem)e.getSource();

if(source == itmOpen){

JDialog message = new Message();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
WindowEvent windowClosing = new WindowEvent(message, WindowEvent.WINDOW_CLOSING);
message.dispatchEvent(windowClosing);

}
}
}

最佳答案

您遇到线程问题:
sleep 在 AWT 的事件分派(dispatch)线程上执行,该线程执行 AWT 和 Swing 中的所有事件处理工作。因此,当您单击菜单项时,它会为 Message 创建对象,但会卡在 setVisible() 方法中,该方法通常会向JDialog 进行布局并显示自身。此消息进入 EDT 队列,在事件处理程序(actionPerformed 方法)完成后,它会被处理。然而 sleep 介于两者之间。

所以尝试这样的事情:

@Override
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem) e.getSource();
if (source == itmOpen) {
final JDialog message = new Message();
new Thread( new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException ex) {
// Do nothing with it
}
WindowEvent windowClosing = new WindowEvent(message, WindowEvent.WINDOW_CLOSING);
message.dispatchEvent(windowClosing);
}
}).start();
}
}

关于java - 含有不可见内容的导致 sleep 的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45852851/

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