我想动态更改面板,并且正如此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(),但我不明白为什么?
答案 0 :(得分:1)
我们要使用repaint()告诉组件重绘自己。将其视为您的案例。虽然revalidate用于更新布局。因此,无论何时动态添加/删除组件,都需要同时调用它们。
以下编写的代码显示 JFrame 设置为 CardLayout 在 JFrame 上完全绘制红色dp1( JPanel )。在dp1上,有一个 Jbutton 。如果单击该按钮,将删除dp1&将绘制dp2( JPanel )。 dp2是绿色区分变化。您似乎忘记了重绘()。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame{
JButton button;
private static MyFrame frame;
public MyFrame(){
this.setSize(400, 400);
this.setLayout(new CardLayout());
this.setLocationRelativeTo(null);
JPanel dp1 = new JPanel();
dp1.setBackground(Color.RED);
add(dp1);
button = new JButton("Click me to remove dp1 & draw dp2");
dp1.add (button);
JPanel dp2 = new JPanel ();
dp2.setBackground(Color.GREEN);
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
frame.getContentPane().remove(dp1);
frame.add(dp2);
frame.revalidate();
frame.repaint();
}});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
}
public static void main(String[] args) {
frame = new MyFrame();
}
}