当我尝试将其添加到ContentPane时,JPanel不会出现

时间:2014-06-22 10:09:06

标签: java swing jpanel contentpane

我在尝试使用按钮更改JPanel时遇到问题。我有一个带有2个面板的JFrame,其中1个用于按钮,我希望它们始终显示。另一个是每次按下另一个面板的按钮时我将切换的那个。问题是每次按下它们都没有显示任何内容,我保留按钮,但我呼叫的另一个面板没有出现。

其中一个按钮的代码如下

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ReparacaoPanel r = new ReparacaoPanel(this, this.jPanel1);
        this.getContentPane().remove(this.jPanel1);
        this.getContentPane().add(r);
        //this.setContentPane(r);
        this.visiblePanel.setVisible(false);
        this.visiblePanel = r;
        this.pack();
        this.setVisible(true);

        r.setLocation(200, 200);
        this.getContentPane().revalidate();
        this.repaint();
    }

如果我尝试使用" this.setContentPane(r);" (它将框架设置为仅显示面板)面板显示。但是当我尝试将其称之为“我在上面的代码中尝试做的事情时,没有任何内容与具有按钮的面板分开显示。”

我不知道我做错了什么,对于我试图打电话的JPanel似乎没有问题,因为它显示单独使用。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

考虑这个工作示例,在面板之间手动切换。这产生了这个输出。

enter image description here enter image description here .........

一些微小的NumberPanel

每个新实例都会在中心显示另一个数字。

import javax.swing.JPanel;
public class NumberPanel extends JPanel {
    private static int counter = 0;
    public NumberPanel() {
        setLayout(new BorderLayout(0, 0));
        JLabel lblNewLabel = new JLabel("" + counter++);
        lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
        add(lblNewLabel);
    }
}

设置框架

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    frame.getContentPane().add(panel, BorderLayout.SOUTH);

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            frame.getContentPane().remove(numberPanel);
            numberPanel = new NumberPanel();
            frame.getContentPane().add(numberPanel, BorderLayout.CENTER);
            frame.pack();
        }
    });
    panel.add(btnNewButton);

    numberPanel = new NumberPanel();
    frame.getContentPane().add(numberPanel, BorderLayout.CENTER);
    frame.pack();
}

Testprogram

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestPanelSwitch {
    private JFrame frame;
    private NumberPanel numberPanel;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestPanelSwitch window = new TestPanelSwitch();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public TestPanelSwitch() {
        initialize();
    }
    private void initialize() {
        // see above
    }
}

回到问题

我认为你只需要pack你的框架,就像匿名ActionListener一样。

frame.getContentPane().remove(numberPanel);
numberPanel = new NumberPanel();
frame.getContentPane().add(numberPanel, BorderLayout.CENTER);
frame.pack();

修改

正如leonidas所提到的那样,也可以重新验证frame。这只需要将上呼叫替换为pack

frame.invalidate();
frame.validate();