【问题标题】:Make main JFrame not visible while splash screen is visible在初始屏幕可见时使主 JFrame 不可见
【发布时间】:2015-07-29 13:38:30
【问题描述】:

我有这个 createAndShowGui() 类,它从另一个方法调用初始屏幕并创建一个用于主应用程序的 JFrame。我一直在试图弄清楚如何在启动画面可见时隐藏 JFrame。

我试过用一个

if (splash.isVisible()){
    frame.setVisible(false)
}
else { frame.setVisible(true)
}

这不起作用。实现这一目标的最佳方法是什么?

private static void createAndShowGui() {
    DrawPanelMain mainPanel = new DrawPanelMain();
    JFrame frame = new JFrame("RF Connection Panel " + version);
    SwingMenu mainBar = new SwingMenu();
    Splash splash = new Splash("C:\\Users\\Rob\\splashscreen.gif", frame, 8000);
    splash.setVisible(true);

    frame.setJMenuBar(mainBar);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.getContentPane().add(mainPanel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

}

Splash.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/*
 * This class creates a splash screen that is displayed when the program is run.  It includes thread management,
 * mouse adapter, and runs with a JWindow on top of the JFrame for the overall application.
 */
public class Splash extends JWindow {
    public Splash(String filename, Frame f, int waitTime) {
        super(f);
        JLabel label = new JLabel(new ImageIcon(filename));
        getContentPane().add(label, BorderLayout.CENTER);
        pack();

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension labelSize = label.getPreferredSize();
        setLocation(screenSize.width / 2 - (labelSize.width / 2), screenSize.height / 2 - (labelSize.height / 2));

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                setVisible(false);
                dispose();
            }
        });

        final int pause = waitTime;
        final Runnable closerRunner = new Runnable() {

            public void run() {
                setVisible(false);
                dispose();
            }
        };

        Runnable waitRunner = new Runnable() {
            public void run(){

            try {
                Thread.sleep(pause);
                SwingUtilities.invokeAndWait(closerRunner);
            }
            catch (Exception e){
                JOptionPane.showMessageDialog(null, e.getStackTrace());
            }
        }
    };

        setVisible(true);
        Thread splashThread = new Thread(waitRunner, "SplashThread");
        splashThread.start();
    }
}

【问题讨论】:

  • 你能告诉我一些关于你的 Splash 课程吗?
  • @bodidely splash(字符串图像名称、帧名称、直到睡眠的 int 时间)
  • @feltersnach 你的问题很不清楚..你能显示 splach 类的相关代码

标签: java swing splash-screen


【解决方案1】:

编辑:想法 2

由于您已将帧传递给 Splash 对象,因此您可以简单地使用隐藏 Splash 的相同方法使其可见。

首先,为框架添加一个实例变量,以便所有方法都可以访问它并将其分配给构造函数参数。

public class Splash extends JWindow {
    private JFrame frame;
    public Splash(String filename, Frame f, int waitTime) {
       super(f);
       this.frame = f;

然后,在您隐藏启动画面的方法中,隐藏您的框架。

addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e){
        setVisible(false);
        this.frame.setVisible(true); 
        dispose();
       }
   });

最后..

 final Runnable closerRunner = new Runnable() {
     public void run() {
         setVisible(false);
         this.frame.setVisible(true);
         dispose();
     }
 };

【讨论】:

  • 用另一个想法更新
  • 这是一个非常接近的解决方案。明天我会再次努力。谢谢。
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多