更新Java Swing JList

时间:2012-03-26 04:12:15

标签: java swing concurrency jlist

我使用 WindowBuilder Pro 生成下面 GuiTest 类中的大部分代码,但带有'////////'的行除外我添加(或更改)的权利。 WindowBuilder Pro(WYSIWYG)不断向构造函数添加代码 - 但是还没有抱怨我进行更改。我想继续以这种方式构建WindowBuilder Pro,所以我不想更改GUI的通用架构

我还在下面创建了一个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()] );///////////
    }///////////
}

DataTest类:

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 个答案:

答案 0 :(得分:2)

将新数据添加到模型中,或者创建包含所有数据的新模型,并将其设置为列表的新模型。


  

我还在下面创建了一个DataTest类,以模拟收集数据集的某个缓慢过程。

SwingWorker调用它。


  

WindowBuilder Pro(WYSIWYG)..

不,WYSIB(你所看到的是破碎的)。 Java布局管理器旨在根据PLAF,操作系统,屏幕分辨率,字体大小和版本之间的调整来计算组件的正确大小(在我的脑海中,可能还有更多)。它们还允许GUI可调整大小。 WindowBuilder Pro使用setBounds()创建的是一个脆弱的GUI,“等待破解”。

答案 1 :(得分:2)

对于JList更新,您只需使用模型。您正在Data ...中的构造函数调用中添加所有值,最好编写任何自定义方法并将值传递给该方法,然后在JList模型中添加值。 可以找到模型示例Java JList model http://www.java2s.com/Tutorial/Java/0240__Swing/0750__JList-Model.htm