简体   繁体   English

Java JList未更新

[英]Java JList Not Updating

Why isn't my JList updating? 为什么我的JList不更新?

I re-instantiate the list object. 我重新实例化列表对象。 I repaint and revalidate... What's going wrong? 我重新粉刷并重新验证...出了什么问题?

needmoredetailsneedmore needmoredetailsneedmore

External class: 外部类:

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

ControlPanel.java ControlPanel.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);
}
}

You've created a new JList which has not been added to the screen 您已经创建了一个尚未添加到屏幕的新JList

Instead, create a new ListModel and set it as the model for the list that's already on the screen 而是创建一个新的ListModel并将其设置为屏幕上已经存在的list的模型

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

See How to use lists for more details 有关更多详细信息,请参见如何使用列表

Your access model is, frankly, scaring. 坦率地说,您的访问模型令人恐惧。 It allows complete access to everything form anywhere, so any nasty class might come along and completely dismantle your UI, for example. 它允许完全访问任何地方的所有形式,因此,例如,可能出现任何讨厌的类并完全拆除UI。

The use if static is not a solution for easy access and greatly reduces the flexibility of your application over time. 如果使用static则不是轻松访问的解决方案,并且随着时间的推移,大大降低了应用程序的灵活性。

You should be providing simply getters and setters to allow outside classes access to the information contained within and managed by the class.eapqually, you should provide the class's with management functionality that other class might need to use, such as refresh . 您应该只提供getter和setter方法,以允许外部类访问包含在该类中并由该类管理的信息。同样,您应该为该类提供其他类可能需要使用的管理功能,例如refresh

No one should care exactly how refresh works, only that it does... 没有人应该在乎刷新的工作原理,只有它可以做到...

Start by taking a look at 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);
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM