2012-03-26 106 views
2

我用windowbuilder親以在GuiTest類的大部分代碼下面用「////////」到我添加右線的異常(或改變)。 WindowBuilder Pro(一種所見即所得)不斷向構造函數中添加代碼 - 但還沒有投訴我進行修改。我想用這種方式繼續使用WindowBuilder Pro,所以我不想更改GUI的一般體系結構。更新一個的Java Swing的JList

我還在下面創建了一個DataTest類來模擬收集數據集的某個緩慢過程。

這是我的問題: 我想要做的就是用DataTest類中的新數據更新JList。

GuiTest類:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.ListSelectionModel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; /////////// 
import javax.swing.JList; 
import javax.swing.JLabel; 

import discoverTool.DataTest; 

public class GuiTest extends JFrame implements ListSelectionListener{ 
    private String[] foo = {"thing1","thing2","thing3"}; ////////////// 

    private JPanel contentPane; 
    private JLabel lblNewLabel; //////////////made global 

    /** 
    * Launch the application. 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        GuiTest frame = new GuiTest(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     DataTest dt = new DataTest();///////////// 
     GuiTest gt = new GuiTest(); 
     gt.foo = dt.foo; 
     gt.updateJList(dt.foo); 
    } 

    public void updateJList(String[] f){ 
     //reset the list with f 
    } 

    /** 
    * Create the frame. 
    */ 
    public GuiTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JList list = new JList(foo); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ///////////// 
     list.setSelectedIndex(0);    ////////////// 
     list.addListSelectionListener(this); //////////////  
     list.setBounds(10, 11, 134, 240); 
     contentPane.add(list); 

     JPanel panel = new JPanel(); 
     panel.setBounds(154, 11, 188, 81); 
     contentPane.add(panel); 
     panel.setLayout(null); 

     //JLabel lblNewLabel = new JLabel("New label");///////// 
     lblNewLabel = new JLabel("New label");/////////// 
     lblNewLabel.setBounds(10, 11, 46, 14); 
     panel.add(lblNewLabel); 
    } 

    public void valueChanged(ListSelectionEvent e) {/////////////// 
     JList jList = (JList)e.getSource();//////////// 
     lblNewLabel.setText(foo[jList.getSelectedIndex()]);/////////// 
    }/////////// 
} 

數據測試類:

public class DataTest { 

    public String[] foo; 

    public DataTest() throws InterruptedException{ 
     //simulate a long process getting data; 
     Thread.sleep(7000); 
     foo = new String[4]; 
     foo[0]="hey"; 
     foo[1]="hi"; 
     foo[2]="bye"; 
     foo[3]="adios"; 
    } 
} 

回答

2

無論是添加新的數據模型,或者創建擁有所有數據的新模式,並設置爲新模式列表。


我還創建下面進一步一個數據測試類模擬採集的數據集的某一緩慢的過程。

SwingWorker調用它。


windowbuilder親(所見即所得)..

沒有,WYSIB(你看到的是破碎)。 Java佈局管理器旨在根據PLAF,操作系統,屏幕分辨率,字體大小以及版本之間的調整(可能會更多)來計算正確的組件大小。它們還允許GUI可調整大小。 WindowBuilder Pro使用setBounds()創建的是一個脆弱的GUI,它「等待中斷」。

+1

WindowBuilder不限於絕對座標;它可以讓你使用所有常見的佈局管理器:GridBagLayout,MiGLayout,SpringLayout,FormLayout,GroupLayout等。如果你手工編寫了很多的GUI代碼,你應該試一試。 – rob 2012-03-27 19:29:45