有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java用另一个JFrame替换现有JPanel的正确方法是什么?

我正在构建一个程序,需要将当前可见的JPanel换成另一个。不幸的是,这件事似乎有很多方面要做,我所有的尝试都以失败告终。我可以成功地让第一个JPanel出现在我的JFrame中,但是交换JPanel会导致一个空白的JFrame

我的主要框架:

public class ShellFrame {

static CardLayout cl = new CardLayout(); //handles panel switching
static JFrame frame; //init swing on EDT
static MainMenu mm; 
static Panel2 p2;
static Panel3 p3;

public static void main(String[] args) {
    initFrame();
}

public static void initFrame() {
    SwingUtilities.invokeLater(new Runnable() {
         public void run() {
              frame = new JFrame();
              frame.setDefaultCloseOperation(3);
              frame.setLayout(cl);

              mm = new MainMenu();
              pp = new PlacementPanel();

              //first panel added to frame will always show first
              frame.add(mm, "MainMenu");
              frame.pack(); //sizes frame to fit the panel being shown
              frame.setVisible(true);
         }
    });
}

public static void switchPanel(String name) {
    cl.show(frame.getContentPane(), name);
    frame.pack();
}

public static void updatePanel2(/* args */) {
   frame.removeAll();
   p2 = new Panel2(/* args */);
   frame.add(pp, "PlacementPanel");
   frame.pack();
   frame.validate();
   frame.repaint();  
}

我试图使用updatePanel2将现有的面板替换为新的Panel2,但它似乎不起作用。Panel2本身运行良好,但尝试将其与我的程序结合使用只会产生一个空白窗口。任何帮助都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    that requires swapping out the current, visible JPanel with another

    请看一下CardLayout以获得如何正确操作的完整示例

  2. # 2 楼答案

    我有一个Swing应用程序,当用户按下“空格”键时,它会“交换”面板,显示运行模拟的实时绘图。我所做的是这样的:

    public class MainPanel extends JPanel implements Runnable {
    
        // Called when the JPanel is added to the JFrame
        public void addNotify() {
    
            super.addNotify();
            animator = new ScheduledThreadPoolExecutor(1);
            animator.scheduleAtFixedRate(this, 0, 1000L/60L, TimeUnit.MILLISECONDS);
        }
    
        public void paintComponent(Graphics g) {
    
            super.paintComponent(g);
    
            if (spacePressed) 
                plot.render(g);
            else
                simulation.render(g);
        }
    
        public void run() {
    
            simulation.update(); 
            repaint();
        }
    }
    
    public class PlotView {
    
        public void render(Graphics g) {
             //draw the plot here
        }
    }
    
    public class SimulationView {
    
        public void render(Graphics g) {
             //draw simulation here
        }
    }
    

    这对我的“show live plot”问题非常有效。还有CardLayout方法,如果你遇到困难,你可能会把它变成一个新的独立问题。祝你好运

  3. # 3 楼答案

    您应该对要替换的面板执行.setVisible(false);

    下面是一个工作示例,当您按“回车”键时,它会切换面板; 如果在IDE中复制,则自动获取导入(Eclipse中的shift+o)

    public class MyFrame extends JFrame implements KeyListener {
    
        private JButton button = new JButton("Change Panels");
        private JPanel panelOnFrame = new JPanel();
        private JPanel panel1 = new JPanel();
    
        public MyFrame() {
            // adding labels to panels, to distinguish them
            panelOnFrame.add(new JLabel("panel on frame"));
            panel1.add(new JLabel("panel 1"));      
    
            setSize(new Dimension(250,250));
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            add(button);
            add(panelOnFrame);
            setVisible(true);
            addKeyListener(this);
    
            addKeyListener(this);
            setFocusable(true);
        }
    
        public static void main(String[] args) {
            MyFrame frame = new MyFrame();
        }
    
        @Override
        public void keyPressed(KeyEvent k) {
            if(k.getKeyCode() == KeyEvent.VK_ENTER){
    

    //+-以下是替代品:

                panelOnFrame.setVisible(false);
                this.add(panel1);
            }
        }
    
        @Override
        public void keyReleased(KeyEvent arg0) {
        }
    
        @Override
        public void keyTyped(KeyEvent arg0) {
        }
    }