Java Jlist не се актуализира

Имам JList в голям графичен интерфейс, изрязах целия друг неподходящ код. Мога да инициализирам списъка, но не мога да добавя/премахвам елементи от него, когато използвам бутон. Всичко, което прочетох, казва да се използва DefaultListModel. След това автоматично ще актуализира списъка, когато го инициализирате отново.
Опитах също да префокусирам и пребоядисам панелите и рамката, но това също не работи.

public static void main(String[] args) {
        Play worker=new Play();
        worker.GUI();
    }

    public void GUI(){
        frame=new JFrame();
        mainPanel=new JPanel(new GridBagLayout());
        filePanel=new JPanel(new GridBagLayout());
        allFilePanel=new JPanel(new GridBagLayout());
        fileInputLabel=new JLabel("Enter the directory of the csv file:");
        fileNameField=new JTextField(25);

        readFileButton=new JButton("Read File");
        ReadFileButtonListener buttonListener=new ReadFileButtonListener();
        readFileButton.addActionListener(buttonListener);


        addItem(filePanel,fileInputLabel , 0, 0, 1, 1, GridBagConstraints.CENTER);
        addItem(filePanel,fileNameField , 1, 0, 2, 1, GridBagConstraints.CENTER);
        addItem(filePanel,readFileButton , 3, 0, 1, 1, GridBagConstraints.CENTER);

        allFileLabel=new JLabel("List of all Data");    
        String [] name={"joe"};
        allFileList=new JList<String>(name);
        allFileList.setVisibleRowCount(10);


        addItem(allFilePanel,allFileLabel , 0, 0, 1, 1, GridBagConstraints.CENTER);
        addItem(allFilePanel,allFileList , 0, 1, 1, 1, GridBagConstraints.CENTER);

        addItem(mainPanel, filePanel, 0, 0, 4, 1, GridBagConstraints.CENTER);
        addItem(mainPanel, allFilePanel, 1, 2, 1, 1, GridBagConstraints.CENTER);

        frame.setSize(1000,800);
        frame.add(mainPanel);
        frame.setVisible(true); 
    }

    /**configures the panels
     * @param p
     * @param c
     * @param x
     * @param y
     * @param width
     * @param height
     * @param align
     */
    private void addItem(JPanel p,JComponent c, int x, int y , int width,int height, int align){
        GridBagConstraints gc=new GridBagConstraints();
        gc.gridx=x;
        gc.gridy=y;
        gc.gridwidth=width;
        gc.gridheight=height;
        gc.weightx=100;
        gc.weighty=100;
        gc.insets=new Insets(5,5,5,5);
        gc.fill=GridBagConstraints.NONE;
        p.add(c,gc);
    }

        private class ReadFileButtonListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {
            generateAllFileList();
        }

    }

    public void generateAllFileList(){
        DefaultListModel<String> list=new DefaultListModel<String>();
        list.addElement("Fred");
        allFileList=new JList<String>(list);    
    }
}

person Clay Petroski    schedule 17.10.2012    source източник
comment
Моля, вижте този отговор за по-лесно решение stackoverflow.com/a/41540123/7392507   -  person Cousin Roy    schedule 20.09.2019


Отговори (2)


С текущия си код вие не актуализирате модела на списъка на JList, а създавате нов JList. След това просто присвоявате този нов JList на члена allFileList, което няма ефект върху панела. Екземплярът JList, който се показва на панела, не се влияе от тази операция.

Грубо казано (и непроверено), трябва да изглежда така:

public void generateAllFileList(){
    DefaultListModel<String> list = allFileList.getModel();
    list.addElement("Fred"); 
}

(и, разбира се, ще трябва да създадете JList с модел на списък по подразбиране вместо масив)

person Andreas Dolk    schedule 17.10.2012

Не трябва да инициализирате отново JList и DefaultListModel всеки път, когато се добави елемент, ще загубите старите елементи. Запазете препратка към DefaltListModel и просто извикайте addElement(), той автоматично ще актуализира списъка, като слуша събития, генерирани от модела.

person Mordechai    schedule 17.10.2012