簡體   English   中英

如何在JPanel類中使JList“刷新”方法

[英]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.eventjavax.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM