Java “如何制作JList”;刷新“;JPanel类中的方法

Java “如何制作JList”;刷新“;JPanel类中的方法,java,swing,class,user-interface,methods,Java,Swing,Class,User Interface,Methods,我是java的初学者,我想制作一个带有包含单独JPanel的选项卡的JFrame。一个面板有一个列表,其中显示您在不同面板中选择的内容,因此我希望此面板始终显示您在不同面板中选择的内容的列表(我希望这是有意义的)。为此,我需要创建一个方法来刷新JList。这是我做过的最远的一次: public class PanelClass extends JPanel { private JList list; private DefaultListModel listModel = new

我是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);
    }
}
公共类PanelClass扩展了JPanel{
私人名单;
private DefaultListModel listModel=新的DefaultListModel();
私有ArrayList objectArray=新ArrayList();
公共类(){
list.setModel(listModel);
}
公共无效刷新(){
updateListModel();
list.setModel(listModel);
}
public void updateListModel(){
if(objectArray.isEmpty()){
System.out.println(“数组中没有对象!”);
}否则{
listModel.clear();
对于(SomeOtherClass SOC:objectArray){
//getName()只返回一个字符串
addElement(SOC.getName());
}
}
}
public void addObjectToArray(其他类别SOC){
objectArray.add(SOC);
}
}

有人能告诉我如何使用“刷新”方法不断更新JList吗?

您可以用两种方法来实现
首先:将其写入无限线程循环中,以便不断更新JList
Second:只要在ArrayList中添加了新的
SOC
对象,就可以调用
refresh()
方法。这意味着您可以从
addObjectToArray()
方法调用
refresh()
方法,该方法只有在您的ArrayList中有一些更改时才最终调用refresh方法


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

AWT/Swing事件模型基于作为事件源的小部件(在MVC范例中,它们既是视图又是控制器)。不同的小部件产生不同的事件类型

查看
java.awt.event
(主要)和
javax.swing.event
包,了解您需要实现和注册的侦听器接口,以产生所需的效果

基本上,您可以编写一个
侦听器
实现,并将其注册到
Widget1
。当
Widget1
检测到事件时,它会通知您,然后您可以使用它提供的信息更新
Widget2

例如,如果单击一个按钮会将一个对象添加到列表中,您可能会遇到如下情况(我通常将此代码放在包含的JFrame类中,并使其实现侦听器接口;但您可以选择使用内部类或单独的侦听器类):

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类MyFrame扩展JFrame实现ActionListener{
私有JButton按钮=新JButton(“单击我!”);
private DefaultListModel listModel=新的DefaultListModel();
私有JList列表=新JList(listModel);
专用整数计数器=1;
公共MyFrame(){
setTitle(“测试更新”);
JTabbedPane tabs=新的JTabbedPane();
添加(选项卡、边框布局、中心);
JPanel面板=新的JPanel();
面板。添加(列表);
选项卡。添加(“选择”,面板);
panel=新的JPanel();
addActionListener(这个);
面板。添加(按钮);
选项卡。添加(“选项”,面板);
包装();
}
@凌驾
已执行的公共无效操作(最终操作事件){
if(button.equals(event.getSource())){
addElement(“项”+计数器++);
}
}
/*试试看*/
公共静态void main(字符串[]args){
最终MyFrame=新MyFrame();
frame.addWindowListener(新的WindowAdapter(){
@覆盖公共无效窗口关闭(最终窗口事件e){
frame.setVisible(假);
frame.dispose();
系统出口(0);
}
});
frame.setVisible(true);
}
}

此代码示例非常简单,但它应该能让您了解如何实现所需的功能。

因此,一旦模型应用于
JList
,您应该能够直接调用
listModel.addElement
,然后它应该会更新。不确定为什么需要
objectArray
。。。?为什么是第一点?为什么不使用
ListModelListener
,它将大大减少处理器密集度,更易于管理?第一点只是一个想法。我知道这很糟糕,感谢
listmodelstener
。当时我不知道这件事。
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);
  }
}