【问题标题】:Java JList Not UpdatingJava JList 未更新
【发布时间】:2014-01-12 05:46:56
【问题描述】:

为什么我的 JList 没有更新?

我重新实例化列表对象。我重新粉刷并重新验证...出了什么问题?

需要更多细节需要更多

外部类:

                ControlPanel.usernames.add(username);
            ControlPanel.list = new JList(ControlPanel.usernames.toArray());
            ControlPanel.panel.repaint();
            ControlPanel.panel.revalidate();

控制面板.java

package main;

import java.awt.BorderLayout;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class ControlPanel extends JFrame {

public static JPanel panel = new JPanel();
JScrollPane scrollpane;
static JLabel players;
static String s;
public static ArrayList<String> usernames = new ArrayList<String>();
public static JList list;

// public static String categories[] = {};

public ControlPanel() {
    list = new JList(usernames.toArray());
    scrollpane = new JScrollPane(list);

    panel.add(scrollpane, BorderLayout.CENTER);
    add(panel);

    setTitle("RuneShadows CP");
    setSize(400, 400);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}
}

【问题讨论】:

  • This answer 我相信展示了如何使用列表的模型对象(而不是创建一个全新的 JList)来更新 JList。
  • 你能不能对我们好一点,发个SSCCE。虽然很明显,疯狂程序员的回答是正确的,如下所示
  • 谢谢泰格。效果很好。

标签: java arrays swing arraylist jlist


【解决方案1】:

您创建了一个尚未添加到屏幕的新JList

相反,创建一个新的ListModel 并将其设置为屏幕上已经出现的list 的模型

ControlPanel.usernames.add(username);
ControlPanel.list,setModel(new UserNamesListModel(ControlPanel.usernames));
ControlPanel.panel.repaint();
ControlPanel.panel.revalidate();

详情请见How to use lists

坦率地说,您的访问模式令人恐惧。它允许完全访问任何地方的所有内容,例如,任何讨厌的类都可能出现并完全拆除您的 UI。

使用 if static 不是一种易于访问的解决方案,并且随着时间的推移会大大降低您的应用程序的灵活性。

您应该提供简单的 getter 和 setter 以允许外部类访问包含在该类中并由该类管理的信息。同样,您应该为该类提供其他类可能需要使用的管理功能,例如 refresh .

没有人应该关心刷新是如何工作的,只要它确实......

先看看How to use lists

import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;

public class UserNamesListModel extends AbstractListModel<String> {

    private List<String> userNames;

    public UserNamesListModel(List<String> userNames) {
        this.userNames = new ArrayList<>(userNames);
    }

    @Override
    public int getSize() {
        return userNames.size();
    }

    @Override
    public String getElementAt(int index) {
        return userNames.get(index);
    }

}

【讨论】:

  • 对不起,我对 ListModel 不熟悉,你能给我举个例子吗?我有 ListModel lm = new DefaultListModel();与 JList 列表 = 新 JList(lm)
  • 我不知道用什么替换 UserNamesListModel。我试过 ArrayList 和 JList。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多