2013-02-01 88 views
1

我會運行程序,但是當我激活事件時,JFrame不會更新(它只會刪除JLabel),除非手動拖動窗口來調整它的大小,即使在事件發生後調用repaint() 。怎麼了?試圖更新我的JFrame,爲什麼不重繪工作?

public Driver() { 
    setLayout(new FlowLayout()); 

    pass = new JPasswordField(4); 
     add(pass); 

    image = new ImageIcon("closedD.png"); 
    label = new JLabel("Enter the password to enter the journal of dreams" , image , JLabel.LEFT); 
     add(label); 

    button = new JButton("Enter"); 
     add(button); 

    event e = new event(); 
     button.addActionListener(e); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    setSize(1600/2 , 900/2); 
    setTitle("Diary"); 
} 

//main method 
// 
// 
public static void main(String[] args) { 
    win = new Driver(); 
} 

public class event implements ActionListener { 
    private boolean clickAgain = false; 

    public void actionPerformed(ActionEvent e) { 
     if (passEquals(password) && clickAgain == false) { 
      image2 = new ImageIcon("openD.png"); 
      remove(label); 

      label = new JLabel("Good Job! Here is the journal of dreams." , image2 , JLabel.LEFT); 
       add(label); 

       clickAgain = true; 
     } 

     repaint(); 
    } 
} 

回答

8

無論何時您添加或移除組件,您都必須告訴其容器重新佈置它所容納的當前組件。你可以通過調用revalidate()來做到這一點。在重新驗證調用之後,您將調用repaint()來重新創建容器。

public void actionPerformed(ActionEvent e) { 
    if (passEquals(password) && clickAgain == false) { 
     image2 = new ImageIcon("openD.png"); 
     remove(label); 

     label = new JLabel("Good Job! Here is the journal of dreams.", 
      image2 , JLabel.LEFT); 
      add(label); 

      clickAgain = true; 
    } 
    revalidate(); // **** added **** 
    repaint(); 
} 

注意:您的問題措辭如此,如果您認爲我們知道您正在嘗試做什麼。下次請給我們更多的信息。問題越好,信息越豐富,答案越好,信息量越大。

編輯2:
我不知道你是否可以簡化你的代碼。而不是刪除和添加JLabel,只需簡單地設置當前JLabel的文本和圖標即可:

public void actionPerformed(ActionEvent e) { 
    if (passEquals(password) && clickAgain == false) { 
     image2 = new ImageIcon("openD.png"); 
     // remove(label); // removed 

     label.setText("Good Job! Here is the journal of dreams."); 
     label.setIcon(image2); 
    } 
} 
+0

非常感謝! –

+0

@MarkdelaCruz:不客氣! –

+0

我的不好。我錯過了你的編輯。同意CL會在這裏矯枉過正。 +1 –