【发布时间】:2017-05-28 04:08:30
【问题描述】:
我需要创建一个简单的延迟(3-5 秒),以便在处理之前可以读取窗口。
我在网上找到了一百万个示例,但它们似乎都给了我同样的问题。我的代码:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JLabel;
public class GrantedPane extends JPanel {
private static final long serialVersionUID = 1L;
public GrantedPane() {
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.setSize(400, 150);
frame.setContentPane(this);
frame.setLocationRelativeTo(null);
frame.setSize(400, 80);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setBorder(new CompoundBorder(BorderFactory.createLineBorder(Color.WHITE), new EmptyBorder(20, 20, 20, 20)));
JLabel grantTitle = new JLabel(" Key Accepted ");
grantTitle.setForeground(Color.YELLOW);
grantTitle.setFont(new Font("Enter The Grid", Font.PLAIN, 32));
grantTitle.setAlignmentX(Component.CENTER_ALIGNMENT);
add(grantTitle);
frame.setVisible(true);
delay(3);
frame.dispose();
}
@Override
protected void paintComponent(Graphics g) {
int w = getWidth(), h = getHeight();
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
GradientPaint gp = new GradientPaint(0, 0, Color.BLACK, 0, h, Color.GRAY);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
void delay (int sec){
try {
TimeUnit.SECONDS.sleep(sec);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
所以这个问题(以及我尝试过的所有其他类型的技术,包括绝望行为中的嵌套 FOR 循环......)是窗口永远不会出现。
我假设这是因为在frame.setVisible() 生效之前就发生了睡眠。我试过wait() 也有同样的效果。
有人可以帮我解决这个问题吗?
编辑--
这是我实例化它的方式(在另一个类中)。在此之前的屏幕变为绿色,然后启动“已接受”窗口。该程序有 8 个类,否则我会把整个事情都扔掉。请注意,我在实例化时收到“未使用”警告,但我不知道为什么。
void validCode() {
color1 = Color.GREEN;
color2 = Color.GREEN;
repaint();
GrantedPane granted = new GrantedPane();
}
【问题讨论】:
-
你试过
sleep()吗? -
@user3226170 你试过用 sleep() 的线程吗?
-
假设使用
Threadsleep()是理想的。这个post 很好参考。 -
在尝试提出更多问题之前,请阅读How do I ask a good question?。
-
“所以这个问题(以及我尝试过的所有其他类型的技术,包括绝望的嵌套 FOR 循环......)的问题是窗口永远不会出现。” - 这是因为您似乎尝试过的每个解决方案都在阻止 EDT。请参阅Concurrency in Swing 了解更多详细信息,How to use Swing Timers 了解典型解决方案