繁体   English   中英

更改JFrame的内容窗格,并且不显示新组件

[英]Change content pane of JFrame and new component not displaying

我正在做一个游戏,试图在不同的JPanel之间切换以显示菜单,世界等。

public static void setComponent(Component component){
        frame.getContentPane().removeAll();
        frame.getContentPane().add(component, 0);   
    }

这是一种更改JFrame框架的组件的方法,该方法首次使用我提供的任何JPanel组件,但是当我尝试从keyListener方法的任何类内部进行更改时,内容窗格都不会显示任何东西。

@Override
        public void mousePressed(MouseEvent arg0) {
            Frame.setComponent(new MenuPanel());
        }

创建JFrame方法和重新绘制组件的线程

public static void createFrame(){
    frame = new JFrame();

    frame.setSize(size);
    frame.setTitle(title);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setLayout(new GridLayout(1,1,0,0));

    new Thread(){
        public void run(){
            while(true){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(frame.getComponentCount() != 0){
                    //System.out.println("?");
                    frame.getContentPane().repaint();   
                    System.out.println(frame.getContentPane().getComponentAt(1, 1));
                }
            }
        }
    }.start();

    setComponent(new MenuPanel());  

    frame.setVisible(true);
}

首次加载时从输出流获取此结果

Menu.MenuPanel[,0,0,794x571,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

然后在使用另一个类的setComponent方法之后

javax.swing.JPanel[null.contentPane,0,0,794x571,invalid,layout=java.awt.GridLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

第一次调用setComponent方法时,需要先执行此操作,然后再调用frame.setVisible(true) ,以强制框架验证其所有组件并显示它们。 以后更改组件时,您需要手动重新验证框架,以使其了解其组件。 将这些行添加到setComponent方法中,它应该可以工作。

public static void setComponent(Component component){
    frame.getContentPane().removeAll();
    frame.getContentPane().add(component, 0);
    frame.revalidate();   // revalidate all the frame components
    frame.repaint();      // and repaint the frame
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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