【问题标题】:How to make a JList "refresh" method in a JPanel class如何在 JPanel 类中创建 JList“刷新”方法
【发布时间】:2013-09-01 08:38:55
【问题描述】:

我是 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 吗?

【问题讨论】:

  • 因此,一旦模型应用于JList,您应该可以直接简单地调用listModel.addElement,它应该会更新。不知道为什么需要objectArray...

标签: java swing class user-interface methods


【解决方案1】:

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);
  }
}

此代码示例是最小的,但它应该让您了解如何实现您想要的。

【讨论】:

    【解决方案2】:

    您可以通过两种方式进行操作。
    第一:写在无限线程循环中,这样它会不断更新JList。
    第二:只要在 ArrayList 中添加新的 SOC 对象,您就可以调用 refresh() 方法。这意味着您可以从 addObjectToArray() 方法调用 refresh() 方法,该方法最终仅在您的 ArrayList 发生一些更改时才调用刷新方法。

    仅供参考:我在我的项目中做到了,我选择了第二种选择。

    【讨论】:

    • ?为什么是第一点?为什么不使用ListModelListener,它的处理器密集度会低得多并且更容易管理?
    • 第一点只是一个想法。我知道这很糟糕,感谢ListModelListener。那时我并不知道。
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2014-08-22
    • 2013-11-14
    • 1970-01-01
    • 2015-04-25
    • 2017-03-11
    • 2011-05-14
    相关资源
    最近更新 更多