2012-06-25 128 views
0

這是我的代碼:的Java Swing的JPanel不會更新

private class ValueReporter implements ListSelectionListener { 

    public void valueChanged(ListSelectionEvent event) { 
     if (!event.getValueIsAdjusting()) { 
      jTextField9.setText(jList2.getSelectedValue().toString()); 
      JLabel someLabel = new JLabel("Some new Label"); 
      jPanel7.add(someLabel); 
      jPanel7.revalidate(); 
     } 
    } 
} 

的「jTextField9」得與文本,但面板「jPanel7」不更新 已分配給它的新標籤更新。

+3

爲更好地幫助更快張貼[SSCCE(http://sscce.org/) – mKorbel

+0

你嘗試過在框架實例上調用'revalidate()'而不是在面板上? –

+0

@DavidKroukamp我收到一個異常,當我嘗試重新驗證框架:異常線程「AWT-EventQueue-0」java.lang.StackOverflowError – Tom

回答

1

下面的代碼片段我趕緊扔在一起,這增加了標籤的JPanelrepaint小號

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class UpdatingJPanel extends JPanel{ 

    public UpdatingJPanel() { 
    Timer timer = new Timer(1500, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     UpdatingJPanel.this.add(new JLabel("A label")); 
     UpdatingJPanel.this.revalidate(); 
     UpdatingJPanel.this.repaint(); 

     if(UpdatingJPanel.this.getComponentCount() == 0){ 
      ((Timer) e.getSource()).stop(); 
     } 
     } 
    }); 
    timer.setRepeats(true); 
    timer.start(); 
    } 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     JFrame testFrame = new JFrame(); 
     testFrame.getContentPane().add(new UpdatingJPanel()); 
     //not using pack() as the panel is still empty and I want avoid 
     //resizing when adding labels as that triggers a repaint 
     testFrame.setSize(200,200); 
     testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     testFrame.setVisible(true); 
     } 
    }); 

    } 
} 
+0

對於帶有明確註釋的參考示例+1,但不要忘記[初始線程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

@trashgod正確。更新了調用EDT上的代碼的主要方法 – Robin