我在尝试使用按钮更改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似乎没有问题,因为它显示单独使用。
任何人都可以帮助我吗?
答案 0 :(得分:2)
考虑这个工作示例,在面板之间手动切换。这产生了这个输出。
.........
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();
}
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();