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

问题描述 投票:0回答:3

我正在构建一个程序,需要将当前可见的 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 本身运行良好,但尝试将它与我的程序结合使用只会产生一个空白窗口。任何帮助将不胜感激!

java swing jframe jpanel
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
    }
}

这对我的“显示实时情节”问题非常有效。还有

CardLayout
方法,如果遇到问题,您可以将其变成一个新的单独问题。祝你好运!


0
投票

您应该对要更换的面板进行

.setVisible(false);

这是一个工作示例,当您按“ENTER”时它会切换面板; 如果您在 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) {
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.