Обновление Java Swing JList

Я использовал WindowBuilder Pro для создания большей части кода в классе GuiTest ниже, за исключением строк с '////////' справа, которые я добавлено (или изменено). WindowBuilder Pro (WYSIWYG) продолжает добавлять код в конструктор, но пока не жаловался, что я вношу изменения. Я хочу продолжать использовать WindowBuilder Pro таким же образом, поэтому я не хочу вносить изменения в общую архитектуру графического интерфейса.

Я также создал класс DataTest ниже, чтобы эмулировать определенный медленный процесс сбора набора данных.

Вот мой вопрос: я хотел бы обновить JList новыми данными из класса DataTest.

Класс 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";
    }
}

person Roger    schedule 26.03.2012    source источник


Ответы (2)


Для обновлений JList вам просто нужно работать с моделью. Вы добавляете все значения внутри вызова конструктора в Data... , лучше вы пишете любой пользовательский метод и передаете свои значения в этот метод, а затем добавляете значения в модель JList. Примеры моделей можно найти в Java JList model http://www.java2s.com/Tutorial/Java/0240__Swing/0750__JList-Model.htm

person Abhishek Choudhary    schedule 26.03.2012

Либо добавьте новые данные в модель, либо создайте новую модель со всеми данными и установите ее в качестве новой модели для списка.


Я также создал класс DataTest ниже, чтобы эмулировать определенный медленный процесс сбора набора данных.

Вызовите его из SwingWorker.


WindowBuilder Pro (WYSIWYG)..

Нет, WYSIB (то, что вы видите, сломано). Менеджеры компоновки Java предназначены для расчета правильного размера компонентов на основе PLAF, ОС, разрешения экрана, размера шрифта и настроек между версиями (на мой взгляд, их, вероятно, больше). Они также позволяют изменять размер графических интерфейсов. То, что WindowBuilder Pro создал с использованием setBounds(), представляет собой хрупкий графический интерфейс, который «ожидает поломки».

person Andrew Thompson    schedule 26.03.2012
comment
WindowBuilder не ограничен абсолютными координатами; он позволяет вам использовать все распространенные менеджеры компоновки: GridBagLayout, MiGLayout, SpringLayout, FormLayout, GroupLayout и т. д. Если вы пишете много кода с графическим интерфейсом вручную, вам стоит попробовать. - person rob; 27.03.2012