首页 文章

将JFrame中的现有JPanel换成另一个JPanel的正确方法是什么?

提问于
浏览
1

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

我的主要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 回答

  • 2

    that requires swapping out the current, visible JPanel with another

    有关如何正确执行此操作的完整示例,请查看CardLayout .

  • 0

    我有一个Swing应用程序,当用户按下'SPACE'键时,它会“交换”面板,显示正在运行的模拟的实时情节 . 我做的是这样的:

    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 方法,如果遇到麻烦,你可能会变成一个新的单独问题 . 祝好运!

  • 0

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

    这是一个工作示例,当您按“ENTER”时它会切换面板;如果在IDE中复制它,则自动获取导入(在Eclipse中移位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) {
        }
    }
    

相关问题