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