1
当我点击按钮时,另一个JFrame类被打开。 JFrame将在2秒后在屏幕上可见,但isVisible在此之前返回true。我想在JFrame实际显示在屏幕上时启动计时器。我怎样才能做到这一点?我试图使用isShowing()和isDisplayable(),但它没有给出预期的结果。如何确保Swing UI实际上显示在屏幕上?
当我点击按钮时,另一个JFrame类被打开。 JFrame将在2秒后在屏幕上可见,但isVisible在此之前返回true。我想在JFrame实际显示在屏幕上时启动计时器。我怎样才能做到这一点?我试图使用isShowing()和isDisplayable(),但它没有给出预期的结果。如何确保Swing UI实际上显示在屏幕上?
你可以使用这样的事情:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class MainApp {
JFrame frame = new JFrame("Main");
JButton button = new JButton("Toggle auxiliary");
JFrame auxFrame = new JFrame("Auxiliary");
public MainApp() {
button.addActionListener(evt -> {
// Delay displaying for 2 seconds
Timer timer = new Timer(2000, event -> {
auxFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
auxFrame.setSize(320, 240);
auxFrame.setVisible(true);
});
timer.start();
auxFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
// Stop timer after the auxiliary frame is displayed
timer.stop();
}
});
});
frame.add(button);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(320, 240);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MainApp::new);
}
}
2S似乎长时间才能显示一个JFrame,可能使它看起来反应迟钝。也许你应该改变初始化框架和它的内容的方式,而不是等待它显示 – jhamon
你将不得不附加一些监听器到你的JFrame中,当你的JFrame被显示时它将被触发。像[WindowListener](https://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowListener.html#windowOpened(java.awt.event.WindowEvent)) –
我同意@jhamon 。我希望你不是想解决潜在的设计缺陷。 – byxor