Java 如何确保Swing UI实际显示在屏幕上?

Java 如何确保Swing UI实际显示在屏幕上?,java,swing,Java,Swing,当我点击按钮时,另一个JFrame类正在打开。JFrame将在2秒后显示在屏幕上,但在此之前isVisible返回true。我想在JFrame实际显示在屏幕上时启动计时器。我怎样才能做到这一点?我尝试使用isShowing()和isDisplayable(),但没有给出预期的结果。您可以使用以下内容: import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.*; pu

当我点击按钮时,另一个JFrame类正在打开。JFrame将在2秒后显示在屏幕上,但在此之前isVisible返回true。我想在JFrame实际显示在屏幕上时启动计时器。我怎样才能做到这一点?我尝试使用isShowing()和isDisplayable(),但没有给出预期的结果。

您可以使用以下内容:

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);
    }
}

您可以使用以下内容:

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,可能使它看起来没有响应。也许您应该改变初始化框架及其内容的方式,而不是等待它显示。您必须将一些侦听器附加到JFrame上,当JFrame显示时,这些侦听器将被触发。就像我同意@jhamon一样。我希望你没有试图解决一个潜在的设计缺陷。你能解释一下为什么需要这个处理时间吗?你有一个逻辑问题。该帧应该在几毫秒内可见。您的帖子显示了该问题。2s显示JFrame的时间似乎很长,可能使其看起来没有响应。也许您应该改变初始化框架及其内容的方式,而不是等待它显示。您必须将一些侦听器附加到JFrame上,当JFrame显示时,这些侦听器将被触发。就像我同意@jhamon一样。我希望你没有试图解决一个潜在的设计缺陷。你能解释一下为什么需要这个处理时间吗?你有一个逻辑问题。框架应该在几分钟后就可以看到,这说明了问题所在。