2012-03-26 79 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