我是java的初学者,想要使用包含单独JPanel的标签创建一个JFrame。一个面板有一个列表,其中显示您在不同面板中选择的内容,因此我希望此面板始终显示您在其他面板中选择的内容列表(我希望这是有意义的)。为此,我需要创建一个方法来刷新JList。这是我得到的最远的:
public class PanelClass extends JPanel {
private JList list;
private DefaultListModel listModel = new DefaultListModel();
private ArrayList<SomeOtherClass> objectArray = new ArrayList<SomeOtherClass>();
public PanelClass() {
list.setModel(listModel);
}
public void refresh() {
updateListModel();
list.setModel(listModel);
}
public void updateListModel() {
if (objectArray.isEmpty()) {
System.out.println("No Objects In Array!");
} else {
listModel.clear();
for (SomeOtherClass SOC : objectArray) {
// SOC.getName() just returns a string
listModel.addElement(SOC.getName());
}
}
}
public void addObjectToArray(SomeOtherClass SOC) {
objectArray.add(SOC);
}
}
有人可以告诉我如何制作一个“刷新”方法来不断保持JList的最新状态吗?
答案 0 :(得分:3)
AWT / Swing事件模型基于作为事件源的小部件(在MVC范例中,它们都是视图和控制器)。不同的小部件来源不同的事件类型。
查看您需要实现和注册的侦听器接口的java.awt.event
(主要)和javax.swing.event
包,以产生您想要的效果。
基本上,您编写了Listener
实现,并将其注册到Widget1
。当Widget1
检测到某个事件时,它会通知您,然后您可以使用其提供的信息来更新Widget2
。
例如,如果单击一个按钮会将对象添加到列表中,您可能会有类似下面的内容(我通常将此代码放在包含JFrame的类中,并使其实现侦听器接口;但您可以选择使用内部类或单独的侦听器类):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame extends JFrame implements ActionListener {
private JButton button = new JButton("Click me!");
private DefaultListModel<String> listModel = new DefaultListModel<String>();
private JList<String> list = new JList<String>(listModel);
private int counter = 1;
public MyFrame() {
setTitle("Test Updates");
JTabbedPane tabs = new JTabbedPane();
add(tabs, BorderLayout.CENTER);
JPanel panel = new JPanel();
panel.add(list);
tabs.add("Selections", panel);
panel = new JPanel();
button.addActionListener(this);
panel.add(button);
tabs.add("Options", panel);
pack();
}
@Override
public void actionPerformed(final ActionEvent event) {
if (button.equals(event.getSource())) {
listModel.addElement("Item " + counter++);
}
}
/* Test it! */
public static void main(String[] args) {
final MyFrame frame = new MyFrame();
frame.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(final WindowEvent e) {
frame.setVisible(false);
frame.dispose();
System.exit(0);
}
});
frame.setVisible(true);
}
}
此代码示例很少,但它应该让您了解如何实现您想要的内容。
答案 1 :(得分:0)
你可以用两种方式做到这一点。
第一:将其写入无限线程循环,以便不断更新JList。
秒:只要在ArrayList中添加了新的refresh()
对象,就可以调用SOC
方法。这意味着您可以从refresh()
方法调用addObjectToArray()
方法,该方法仅在您对ArrayList进行一些更改时才最终调用refresh方法。
仅供参考:我在我的项目中做到了,我选择了第二个选项。