Java:为什么验证不起作用

时间:2014-05-15 03:15:04

标签: java validation jpanel

我想动态更改面板,并且正如此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
}

但是第一个面板并没有消失,我必须将其最小化以刷新它,这样我才能看到第二个面板。我的问题是为什么验证不起作用以及是否有其他替代方案。感谢。

修改:这是我剪辑的有关该面板的图片。(第一个面板):enter image description here

(点击后):enter image description here

修改 madProgrammer和Adarsh Singhal提供了两种解决问题的方法。第一个是第二个面板不调用super.paintComponent(),所以添加它然后它工作正常(因为这个answer说,它是橡皮擦所以第一个面板消失了)。第二个是调用frame.repaint(),但我不明白为什么?

1 个答案:

答案 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();
    }
}