【问题标题】:How to make sure Swing UI is actually displayed on screen?如何确保 Swing UI 实际显示在屏幕上?
【发布时间】:2016-12-07 17:05:25
【问题描述】:

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

【问题讨论】:

  • 2s 显示 JFrame 似乎很长,可能使它看起来没有响应。也许您应该更改初始化框架及其内容的方式,而不是等待它显示
  • 您必须在您的 JFrame 上附加一些侦听器,当您的 JFrame 显示时将触发该侦听器。喜欢WindowListener
  • 我同意@jhamon。我希望您不要试图解决潜在的设计缺陷。
  • 你能解释一下这个处理时间吗?
  • 你的逻辑有问题。该框架应该在几毫秒内可见。发布您的 minimal reproducible example 来证明问题。

标签: java swing


【解决方案1】:

你可以这样使用:

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

【讨论】:

    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2018-08-22
    • 1970-01-01
    • 2012-08-22
    • 2021-12-06
    相关资源
    最近更新 更多