Java Jlist 不更新

标签 java swing jlist

我在一个大的 gui 中有一个 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);    
    }
}

最佳答案

使用当前代码,您不会更新 JList 的列表模型,而是创建一个新的 JList。然后,您只需将这个新的 JList 分配给 allFileList 成员即可,这对面板没有任何影响。显示在面板上的 JList 实例不受此操作的影响。

粗略地说(未经测试),它应该是这样的:

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

(当然,您必须使用默认列表模型而不是数组创建 JList)

关于Java Jlist 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928106/

相关文章:

java - 添加 JFrame 事件处理程序之前滞后?

java - 检索 JList 项的数组数据

java - 分割字符串时的"java.lang.NullPointerException"

java - 在 for-each 语句中使用枚举而没有 RAM 限制?

java - 在 Activity 之间发送 ArrayList<float[]> (android)

java - 我应该将 Swing 组件声明为实例变量,还是只是从函数返回它们?

java - 让家庭 Intent 转向特定的应用程序 Activity ?

java - 当鼠标事件定位到具有鼠标监听器的 JComponent 时,如何将鼠标事件定位到更深的 JComponent

java - 使用多个 View 填充 JList

java - 具有多行文本和动态高度的 Swing JList