【发布时间】:2014-07-03 08:00:26
【问题描述】:
我想动态更改面板,正如answer 所示,他们建议使用cardLayout。但我想更改整个 UI(没有旧按钮),而 cardLayout 似乎不太方便。所以我有以下代码:
JFrame frame = new JFrame ("Key test");
MyDrawPanel1 dp1 = new MyDrawPanel1(frame);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible (true);
JPanel p = new JPanel ();
p.setLayout(new BorderLayout());
p.add(dp1,BorderLayout.CENTER);
frame.getContentPane().add(p);
frame.pack();
frame.setVisible (true);
并且在 MyDrawPanel1 中有一个按钮可以改变面板:
public MyDrawPanel1(final JFrame frame) {
clickButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
frame.getContentPane().removeAll();
//frame.validate();
frame.getContentPane().add(new MyDrawPanel2());
((JPanel)frame.getContentPane()).revalidate();
}
});
this.add(clickButton);
}
编辑:MyDrawPanel1 中还有一些代码。
JButton clickButton = new JButton("click");
Image image = new ImageIcon("D:/0.jpg").getImage();
public void paintComponent (Graphics g) {
super.paintComponent(g);
g.drawImage(image, 3, 40, null);
}
public Dimension getPreferredSize() {
if (image != null) {
return new Dimension(image.getWidth(null), image.getHeight(null));
}
return super.getPreferredSize(); // default
}
但是第一个面板并没有消失,我必须最小化它才能刷新它,这样我才能看到第二个面板。我的问题是为什么验证不起作用以及是否还有其他选择。谢谢。
编辑:这是我截取的关于面板的图片。(第一个面板):
(点击后):
编辑: madProgrammer 和 Adarsh Singhal 提供了两种解决问题的方法。第一个是面板不调用 super.paintComponent() 的第二个,所以添加它然后它就可以正常工作(就像 answer 说的那样,它是橡皮擦,所以第一个面板消失了)。第二个是调用frame.repaint(),但是我不明白为什么?
【问题讨论】:
-
试试
revalidate(),CardLayout有什么问题? -
API 可能不认为面板处于无效状态。
-
我认为你需要的是 invalidate(),而不是 validate()。
-
@MadProgrammer 对不起,我不明白你在说什么。哪个面板处于无效状态。
-
实际上,从您的屏幕截图来看,您似乎因为不调用
super.paintXxx而破坏了绘制链。实际的runnable example that demonstrates your problem 将涉及更少的猜测工作和更好的响应
标签: java validation jpanel