简体   繁体   中英

How to make a JFrame (with timer) open another JFrame from another class

New here - my first question. Anyway, I am here because I want to make a JFrame, that is timed for 10000 milliseconds, I think, and then when it closes, it should open another (which is in another class). I already did the timer part, not the 'closing the timed JFrame, and opening another' part.

I remember doing this, and found an answer. It went something like NewClass.show() ('NewClass' is the class name that should open) and then you type in OldClass.dispose() ('OldClass' is the class name that should close).

Here is my code so far:

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class SplashScreen extends JPanel {

public SplashScreen() {
 setOpaque(false);
 setLayout(new FlowLayout());
}

public static void main(String[] args) {

    final JFrame frame = new JFrame("Loading game...");
    frame.setSize(800, 600);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    SplashScreen background = new SplashScreen();
    frame.add(background);

    Timer timer = new Timer(10000, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            frame.setVisible(false);
            frame.dispose();
           //I want to place my code here so then this class will close, and then the other class will open
        }
    });
    timer.setRepeats(false);
    timer.start();

    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Image image = toolkit.getImage("Waiting.png");
    Point hotSpot = new Point(0,0);
    Cursor cursor = toolkit.createCustomCursor(image, hotSpot, "Cursor");
    frame.setCursor(cursor);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    int w = frame.getSize().width;
    int h = frame.getSize().height;
    int x = (dim.width - w) / 2;
    int y = (dim.height - h) / 2;

    frame.setLocation(x, y);

    JButton button = new JButton();

    JPanel panel = new JPanel();

}

public void paint(Graphics g) {
    Image a=Toolkit.getDefaultToolkit().getImage("Splash Screen.gif");
    g.drawImage(a,0,0,getSize().width,getSize().height,this);
    super.paint(g);

    }
}

I didn't make the second class (which would be called 'LoadingScreen.class', but I will, and it will just have 'JSomethings' or whatever (like JFrame, JPanel, etc...)

I can make the second class, but all I want is the first class to close after the timer finishes at 10 seconds, or 10000 milliseconds, and then automatically open the second class.

Thanks

Try adding the call to your second class like below

Timer timer = new Timer(10000, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        frame.setVisible(false);
        frame.dispose();
       //I want to place my code here so then this class will close, and then the other class will open

       //SplashScreen screen = new SplashScreen();
       //screen.showGUI();
    }
});

Another good practice is to call frame.setVisible(true) at the last so that you wont find any drift in the frame position on the screen.

Suppose your second class is like,

public class LoadingScreen extends JFrame   
{    
    public LoadingScreen(String title)  
    {   
        super(title);  
    }

    public void showGUI()   
    {
        //  Do whatever you want
        setSize(500,500);
        setVisible(true);
    }
}

You just have to call,

LoadingScreen loadScreen = new LoadingScreen("Loading screen....");
loadscreen.showGUI();

当您调用frame.setVisoble(true)时,不会收到错误消息,无法从静态上下文引用非静态方法吗?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM