2014-05-15 89 views
1

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

但第一面板不消失,我要尽量减少它刷新它,所以我可以看到第二面板。我的问题是为什么验证不起作用,以及是否有其他选择。谢谢。

编辑:这里是我剪断关于面板的照片(第一组):enter image description here

(后点击):enter image description here

编辑: 的madProgrammer和阿达什讷辛格尔提供两个解决问题的方法。第一个是面板不调用super.paintComponent()的第二个,所以添加它然后它工作正常(因为这answer说,它是橡皮擦,所以第一个面板不见了)。第二个是调用frame.repaint(),但我不明白为什么?

+1

尝试'revalidate()',和CardLayout怎么了? –

+1

API有可能不认为面板处于无效状态。 – MadProgrammer

+0

我认为你需要的是invalidate(),而不是validate()。 –

回答

1

我们必须使用repaint()来告诉组件重新绘制自己。将其视为您的情况。虽然重新验证用于更新布局。所以,无论何时动态添加/删除组件,都需要调用它们。

下面所写的代码显示一个的JFrame设置为CardLayout画出红DP1(的JPanel)完全上的JFrame。在dp1上,有一个Jbutton。如果您单击该按钮,dp1将被删除& dp2(JPanel)将被绘制。 dp2是绿色区分变化。你好像忘记了repaint()

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(); 
    } 
} 
+0

谢谢,它可以很好地重绘。还有一个问题是为什么? – Tony

相关问题