Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel之间切换_Java_Arraylist_Jframe_Jpanel_Visible - Fatal编程技术网

Java 在JPanel之间切换

Java 在JPanel之间切换,java,arraylist,jframe,jpanel,visible,Java,Arraylist,Jframe,Jpanel,Visible,我想做个游戏。游戏中有几个不同的屏幕,如主菜单和实际的游戏屏幕。每一个都是一个单独的jpanel扩展。我已经将它们添加到我的JFrame中,这是一个名为Game的类。在我的游戏课上,我有以下方法 public void addPanel( JPanel p ) { panels.add( p ); // An array of all the different panels I need this.getContentPane().add( p ); } public voi

我想做个游戏。游戏中有几个不同的屏幕,如主菜单和实际的游戏屏幕。每一个都是一个单独的jpanel扩展。我已经将它们添加到我的JFrame中,这是一个名为Game的类。在我的游戏课上,我有以下方法

public void addPanel( JPanel p ) {
    panels.add( p ); // An array of all the different panels I need
    this.getContentPane().add( p );
}

public void switchToPanel( JPanel p ) {
    for ( JPanel somePanel : panels ) {
        somePanel.setVisible( false );
    }

    p.setVisible( true );
    repaint();
}
这一点是,我有许多不同的面板,当我需要显示一个特定的面板时,例如菜单屏幕,我调用SwitchTopPanel(myPanel)。基本上只是隐藏每个面板,然后取消隐藏我需要看到的面板。唯一的问题是,当我切换到这些面板时,它们并没有显示出来。唯一会出现的是我最后添加的面板。在Objective C中,我一直使用这种技术在视图之间切换,我从来没有遇到过任何问题。这种事情在java中是不允许的吗


编辑:现在我在切换后调用repaint(),但它仍然不起作用

您可以做许多不同的事情来达到相同的效果

我的第一个建议是使用(),因为这是它的设计目的


另一种方法是使用()

如果你正在制作一个游戏,你可以在一个不同于
EDT
的单独线程中制作它。大多数游戏通过不更改面板来显示不同的屏幕,但它们使用单个面板,并根据
游戏状态
进行渲染

这里有一个例子

public class MyGame extends JPanel implements Runnable {

    public static enum GameState {
        MENU, INTRO, LEVELS, END, TITLES
    }

    GameState state = GameState.MENU;

    public MyGame(){
        setDoubleBuffered(true);
        // Initialize the resources
        new Thread(this).start();
    }

    public void update(long elapsedTime){
        switch (state){
            case MENU:
                // Show the menu
                break;
            ....
        }
    }

    private void GameLoop(){
        // Game Loop goes here
    }

    public void run(){
        GameLoop();
    }

    public void paint(Graphics g){
        // switch and draw your game
    }

    public static void main(String[] args){
        JFrame f = new JFrame("MyGame");
        f.setSize(640, 480);
        f.add(new MyGame());
        f.setVisible(true);
    }
}


如果一个状态,即菜单完成,则更改
状态
变量。在你自己制作之前,先学习使用
游戏引擎。

如果你想在两个面板之间切换,请将这些面板添加到另一个JPanel并使用cardLayout。然后,在添加
JPanel
之前,删除当前的一个。像这样:

parentPanel.removeAll();
parentPanel.repaint();
parentPanel.revalidate();

parentPanel.add(childPanel1);
parentPanel.repaint();
parentPanel.revalidate();

同样,对其他子面板也要这样做。

有一段时间没有接触过这些,但我认为如果你想看到它,你需要对框架进行喷漆/重新喷漆。是的,我认为cardLayout是一个不错的选择。@Sean它是为了做你想做的,为什么要重新发明轮子(我现在很懒;))事实上我知道了,由于某些原因,每次向帧添加jpanel时,我都必须调用pack()。我不能只添加它们然后调用pack(),我必须在添加每个面板后调用它一次。奇怪@ChristianDaley小心使用
pack()
。如果内容的大小改变,框架的大小也会改变。这可能不是您想要的效果。最好使用
invalidate()
repaint()
。。。或者
CardLayout
哪种解决方案更好;)谢谢你的提示,但是我添加的所有jpanel都是用与我的主jframe相同的宽度和高度初始化的,并且宽度和高度都没有改变。