Java 当启动屏幕可见时,使主框架不可见

Java 当启动屏幕可见时,使主框架不可见,java,swing,splash-screen,Java,Swing,Splash Screen,我有一个createAndShowGui()类,它从另一个方法调用初始屏幕,并创建一个用于主应用程序的JFrame。我一直在试图找出如何在启动屏幕可见时隐藏JFrame 我试着用一个 if (splash.isVisible()){ frame.setVisible(false) } else { frame.setVisible(true) } 这不管用。实现这一目标的最佳方式是什么 private static void createAndShowGui() { DrawP

我有一个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();
    }
}
编辑:创意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();
     }
 };

你能告诉我一些关于你的Splash类的情况吗?@bodidely Splash(字符串imagename,帧名,int time to sleep)@feltersnach你的问题很不清楚..你能用另一个想法显示Splash类更新的相关代码吗?这是一个非常接近的解决方案。我明天再做一次。谢谢