2014-05-15 147 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

相關問題