[英]How to make a JList “refresh” method in a JPanel class
我是Java的初學者,想制作一個JFrame,其選項卡包含單獨的JPanel。 一個面板有一個列表,其中顯示了您在其他面板中選擇的內容,因此,我希望該面板始終顯示您在另一個面板中選擇的內容的列表(我希望這很有意義)。 為此,我需要制定一種刷新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保持最新狀態嗎?
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);
}
}
此代碼示例是最少的,但是它應該使您了解如何實現所需的內容。
您可以通過兩種方式進行。
第一 :在無限線程循環中編寫它,以便它將不斷更新JList。
第二 :只要在ArrayList中添加了新的SOC
對象,就可以調用refresh()
方法。 這意味着您可以從addObjectToArray()
方法中調用refresh()
方法,而只有在ArrayList中有一些更改時,該方法才最終調用refresh方法。
僅供參考:我在項目中做到了,因此我選擇了第二個方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.