更改JFrame的内容窗格和未显示的新组件

时间:2015-12-29 23:15:49

标签: java swing

我正在制作游戏,并且我尝试在不同的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=]

1 个答案:

答案 0 :(得分:0)

第一次调用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
}