Обновите Java Swing JList - PullRequest
       5

Обновите Java Swing JList

2 голосов
/ 26 марта 2012

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

Я также создал класс 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";
    }
}

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

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

2 голосов
/ 26 марта 2012

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


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

Позвоните ему из SwingWorker.


WindowBuilder Pro (WYSIWYG) ..

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

...