我想动态更改面板,并且正如answer所示,他们建议使用cardLayout。但我想改变整个UI(没有旧的按钮),cardLayout似乎不太方便。所以,我有以下代码:Java:为什么验证不起作用
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有一个按钮来改变面板:在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);
}
编辑。
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和阿达什讷辛格尔提供两个解决问题的方法。第一个是面板不调用super.paintComponent()的第二个,所以添加它然后它工作正常(因为这answer说,它是橡皮擦,所以第一个面板不见了)。第二个是调用frame.repaint(),但我不明白为什么?
尝试'revalidate()',和CardLayout怎么了? –
API有可能不认为面板处于无效状态。 – MadProgrammer
我认为你需要的是invalidate(),而不是validate()。 –