如何改变JList?

How to change JList?

我正在开发一个带有一些按钮和 JList 的程序。 它非常简单,它唯一能做的就是显示 JList 中的点击次数。 这是一个学校课程,我必须用 JList.

来完成

我设法让它与 JLabel 一起工作(计算所有点击并在底部显示),但与 JList.

不兼容

有四个按钮,每个按钮都有自己的计数器。如何更新 JList 中的 JList(单击特定按钮的次数)?

我为每个按钮制作了一个 int 变量,只要单击按钮,它就会在 actionPerformed 方法中更新。 JList 显示这些变量,按钮名称在其前面。 但它停留在 0,我该如何更新 JList

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.*;

public class Task1 extends JFrame implements ActionListener {

public int m1 = 0;
public int m2 = 0;
public int m3 = 0;
public int m4 = 0;

JButton Menue1;
JButton Menue2;
JButton Menue3;
JButton Menue4;
JLabel unten;
JLabel text;

JList<String> Liste;



public Task1(){
    setTitle("Menüauswahl");

    // Bereits gewählte Menüs
    JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        add(panel, BorderLayout.EAST);

    text = new JLabel("Bereits gewählte Menüs  ");
        panel.add(text);

    String[] menues = {"Menü 1: " + m1+"x", "Menü 2: " + m2+"x", "Menü 3: " + m3+"x", "Menü 4: " + m4+"x"};
        Liste = new JList<String>(menues);
        panel.add(Liste);

    


    // Menürbar
    JMenuBar menubar = new JMenuBar();

        JMenu Datei = new JMenu("Datei");
        menubar.add(Datei);
        setJMenuBar(menubar);


    // Gesamt Menüs
    unten = new JLabel("Menüs Insgesamt: 0", SwingConstants.CENTER);

        unten.setBorder(new LineBorder(Color.BLACK));
        add(unten, BorderLayout.SOUTH);



    // Menü-Auswahl / Buttons
    JPanel panel1 = new JPanel();
        
        panel1.setLayout(new GridLayout(2,2, 10, 10));
        add(panel1, BorderLayout.CENTER);

            Menue1 = new JButton("Menü 1");
            Menue1.addActionListener(this);
            panel1.add(Menue1);

            Menue2 = new JButton("Menü 2");
            Menue2.addActionListener(this);
            panel1.add(Menue2);

            Menue3 = new JButton("Menü 3");
            Menue3.addActionListener(this);
            panel1.add(Menue3);

            Menue4 = new JButton("Menü 4");
            Menue4.addActionListener(this);
            panel1.add(Menue4);


    //Fenster Config
    setSize(450 , 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
        
}

@Override
public void actionPerformed(ActionEvent click) {
  
    if(click.getSource()==Menue1){
        m1+=1;
        System.out.println(m1);
        unten.setText(String.format("Menüs Insgesamt: " + (m1+m2+m3+m4)));
        
    }

    if(click.getSource()==Menue2){
        m2+=1;
        System.out.println(m2);
        unten.setText(String.format("Menüs Insgesamt: " + (m1+m2+m3+m4)));
    }

    if(click.getSource()==Menue3){
        m3+=1;
        System.out.println(m3);
        unten.setText(String.format("Menüs Insgesamt: " + (m1+m2+m3+m4)));
    }

    if(click.getSource()==Menue4){
        m4+=1;
        System.out.println(m4);
        unten.setText(String.format("Menüs Insgesamt: " + (m1+m2+m3+m4)));
    }

}


public static void main(String[] args){
    new Task1();
    

}

}

因为你的例子是学校级别的(不是冒犯,我只是不想全部重写),我们会保持简单。

截至目前,您是通过 JList 的构造函数

直接输入项目
String[] menues = {
   "Menü 1: " + m1+"x", 
   "Menü 2: " + m2+"x",
   "Menü 3: " + m3+"x",
   "Menü 4: " + m4+"x"
};

Liste = new JList<String>(menues);

这仅适用于展示,因为您无权访问能够更新的 ListModel
因此我们需要自己实例化一个 DefaultListModel

private final DefaultListModel<String> listModel;

并添加我们的初始值

listModel = new DefaultListModel<>();
listModel.addElement("Menü 1: 0x");
listModel.addElement("Menü 2: 0x");
listModel.addElement("Menü 3: 0x");
listModel.addElement("Menü 4: 0x");

现在,用 DefaultListModel

构建 JList
Liste = new JList<>(listModel);

然后我们可以直接在 actionPerformed

中使用我们的模型更新列表项
if (click.getSource() == Menue1) {
   ...
   listModel.setElementAt("Menü 1: " + m1 + "x", 0); // Indexes start at 0!
}

if (click.getSource() == Menue2) {
   ...
   listModel.setElementAt("Menü 2: " + m2 + "x", 1);
}

if (click.getSource() == Menue3) {
   ...
   listModel.setElementAt("Menü 3: " + m3 + "x", 2);
}

if (click.getSource() == Menue4) {
   ...
   listModel.setElementAt("Menü 4: " + m4 + "x", 3);
}

无论如何,记得read the documentation,永远!