2013-06-05 49 views
1
import java.awt.*; 
import javax.swing.*; 

public class Class4 { 

    public static final long serialVersionUID = 1L; 

    public void mainMethod(int event){ 
     JFrame f = new JFrame("Love Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(500,200);  
     f.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 

     if(event == 0){ 




      JPanel p = new JPanel(); 
      p.setLayout(new BoxLayout(p,BoxLayout.Y_AXIS)); 
      p.setBounds(150, 0, 500, 75); 
      p.setPreferredSize(new Dimension(150,75)); 
      JTextField boy = new JTextField(); 
      boy.setMaximumSize(new Dimension(200,40)); 
      JTextField girl = new JTextField(); 
      girl.setMaximumSize(new Dimension(200,40)); 
      p.add(boy); 
      p.add(girl); 
      gbc.insets = new Insets(-90,310,0,0); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      f.add(p,gbc); 

      JPanel p3 = new JPanel(new BorderLayout()); 
      p3.setBounds(0, 0, 150, 75); 
      p3.setPreferredSize(new Dimension(150,75)); 
      Class5 c5o = new Class5(); 
      c5o.setPreferredSize(new Dimension(150,75)); 
      p3.add(c5o); 
      gbc.insets = new Insets(0,0,90,330); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      f.add(p3,gbc); 

      JPanel p2 = new JPanel(new FlowLayout()); 
      Class7 c7o = new Class7(); 
      p2.add(c7o); 
      p2.setPreferredSize(new Dimension(300,40)); 
      gbc.insets = new Insets(0,0,-20,0); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      f.add(p2,gbc); 

      f.setVisible(true); 

      //1st 
      JOptionPane.showMessageDialog(null,f.isVisible()); 


     } 

     if(event == 5){ 

      JPanel p4 = new JPanel(new BorderLayout()); 
      p4.setBounds(0,140,500,55); 
      Class2 c2o = new Class2(); 
      Dimension d2 = new Dimension(500,55); 
      c2o.setPreferredSize(d2); 
      p4.setPreferredSize(d2); 
      p4.add(c2o); 
      gbc.insets = new Insets(0,0,-130,0); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      f.add(p4,gbc); 

      f.invalidate(); 
      f.validate(); 
      f.repaint(); 

      //2nd 
      JOptionPane.showMessageDialog(null,f.isVisible()); 
     } 

    } 

} 

重新驗證和重新繪製不起作用。我有一個佈局管理器,所以我懷疑問題與if語句有關。我第一次測試f的可見性,它迴歸真實。第二次我測試了同樣的東西,它返回了錯誤。爲什麼我的重新驗證和重繪工作不成功?我需要怎麼做才能使它起作用?重新驗證和重新繪製不工作

+0

'重新驗證並重新繪製不起作用.' - 您的代碼沒有使用revalidate()。 – camickr

回答

3

該代碼存在一些問題,但主要的是您的JFrame參考f的範圍。

假設你以某種方式調用方法這樣main樣品中:

public static void main(String[] args) { 
    Class4 c = new Class4(); 
    c.mainMethod(0); 
    c.mainMethod(5); 
} 

然後,你的代碼是在第二個呼叫過程中創建第二JFrame

移動創建的JFrame到構造,使f一個成員變量:

public class Class4 { 

    private JFrame f; 

    public Class4() { 
     f = new JFrame("Love Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(500,200);  
     f.setLayout(new GridBagLayout()); 
    } 

    // ... 
} 

然後,您可以修改的JFrame在mainMethod()的後續調用。

一些其他注意事項:

  • Avoid reusing GridBagConstraints。通過構造函數創建它們。這使代碼更加健壯。
  • 您不需要再從JFrame獲得contentPane(如其他答案中的建議)。從Java 1.5開始,JFrameadd()方法直接委託給內容窗格。
  • 將組件添加到JFrame時,不需要執行invalidate()repaint()add()已經使組件層次結構無效。但是,當組件已經顯示時(如您的情況),您需要撥打validate()。有關更多信息,請參閱java.awt.Container.add()
+0

什麼是成員變量? @Andreas –

+0

類成員是綁定到類的屬性(或方法)。我已經更新了我的答案,使其更清晰。你的引用'f'是你的'mainMethod()'的本地對象,因此當方法結束時超出範圍。 –

+0

我無法在Class4中使用構造函數,因爲我有其他類需要爲該類創建對象。這將導致整個程序混亂。 @Andreas –

3
if(event == 5){ 

     JPanel p4 = new JPanel(new BorderLayout()); 
     p4.setBounds(0,140,500,55); 
     Class2 c2o = new Class2(); 
     Dimension d2 = new Dimension(500,55); 
     c2o.setPreferredSize(d2); 
     p4.setPreferredSize(d2); 
     p4.add(c2o); 
     gbc.insets = new Insets(0,0,-130,0); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     f.add(p4,gbc); 

     f.invalidate(); 
     f.validate(); 
     f.repaint(); 

     //2nd 
     JOptionPane.showMessageDialog(null,f.isVisible()); 
    } 

f它是不可見的(缺少f.setVisible(true);),所以不需要進行重新驗證在這種情況下重新繪製,它不會對用戶可見。 也使用記錄器或斷點來測試f.isVisible(),因爲這會阻止用戶界面。

+0

對不起,我真的不明白你的答案... @matheszabi –

+0

這就是問題! - 添加一個f.setVisible(true);在JOptionPane.showMessageDialog(null,f.isVisible())之前; – 2013-06-05 11:57:02

+0

這是可見的,但使其可見不是主要目的。我的目標是刷新JFrame。 @matheszabi –

2

我無法準確查看您要查找的內容。一個SSCCE會真的幫助。這是你在找什麼?

import java.awt.*; 
import javax.swing.*; 

class Canv extends JComponent { 

    GridBagConstraints gbc; 

    public Canv (int event) { 

     gbc = new GridBagConstraints(); 

     switch(event) 
     { 
      case 0: 
       this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); 
       this.setBounds(150, 0, 500, 75); 
       this.setPreferredSize(new Dimension(150,75)); 
       JTextField boy = new JTextField(); 
       boy.setMaximumSize(new Dimension(200,40)); 
       JTextField girl = new JTextField(); 
       girl.setMaximumSize(new Dimension(200,40)); 
       this.add(boy); 
       this.add(girl); 
       gbc.insets = new Insets(-90,310,0,0); 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       this.add(this,gbc); 

       JPanel p3 = new JPanel(new BorderLayout()); 
       p3.setBounds(0, 0, 150, 75); 
       p3.setPreferredSize(new Dimension(150,75)); 
       //Class5 c5o = new Class5(); 
       //c5o.setPreferredSize(new Dimension(150,75)); 
       //p3.add(c5o); 
       gbc.insets = new Insets(0,0,90,330); 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       this.add(p3,gbc); 

       JPanel p2 = new JPanel(new FlowLayout()); 
       //Class7 c7o = new Class7(); 
       //p2.add(c7o); 
       p2.setPreferredSize(new Dimension(300,40)); 
       gbc.insets = new Insets(0,0,-20,0); 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       this.add(p2,gbc); 
       break; 
      case 5: 
       JPanel p4 = new JPanel(new BorderLayout()); 
       p4.setBounds(0,140,500,55); 
       //Class2 c2o = new Class2(); 
       Dimension d2 = new Dimension(500,55); 
       //c2o.setPreferredSize(d2); 
       p4.setPreferredSize(d2); 
       //p4.add(c2o); 
       gbc.insets = new Insets(0,0,-130,0); 
       gbc.gridx = 0; 
       gbc.gridy = 0; 
       this.add(p4,gbc); 

       //this.invalidate(); 
       this.validate(); 
       this.repaint(); 

       JOptionPane.showMessageDialog(null,this.isVisible()); 
       break; 
      default: 
       break; 
     } 
    } 

    public void paintComponent(){ 

    } 


} 

public class Class4 { 

    static int event; 
    static JFrame frame; 
    static Canv canvas; 

    public static void main(String[] args) 
    { 
     frame = new JFrame("Love Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500,200);  
     frame.setLayout(new GridBagLayout()); 
     //event = Integer.parseInt(args[0]); 
     event = 5; 
     canvas = new Canv(event); 
     frame.add(canvas); 
     frame.setVisible(true); 
    } 
} 

運行上述代碼將在對話框中返回true。爲了在事件之間切換,只需在Class4中添加另一個方法來重置Canv,方法是使用不同的事件編號調用它的構造函數。

+0

這樣的類 –