如何在程序中自动更改Label setter 名称为运行?

How can I change automatically a Label setter name in the program when it is running?

例如

JLabel label0 = new JLabel("");
JLabel label1 = new JLabel("");
JLabel label2 = new JLabel("");
JLabel label3 = new JLabel("");
JLabel label4 = new JLabel("");

for (int i = 0;i<5;i++)
{
    labeli.setText(i);
    
}

在此代码中,for 自动更改标签文本,首先是 label0,然后是 label1 等。显然,这是行不通的。我最好的解决方案是我做一个 if,如果我 == 0 设置 label0 等。但也许有一个我不知道的更简单的解决方案。 (而且如果我做100个元素,写下来的时间会很长)

  1. 创建您自己的 class 并扩展 JLabel class

  2. 构造函数启动后,将class添加到持有者中(持有您的自定义class)

    class MyJLabel extends JLabel
    {
        public MyJLabel(String name)
        {
            super(name);
            holder.add(this);
        }
    }
    

你的支架应该看起来像

List<MyJLabel> holder = new ArrayList<>();

然后,您可以使用 lambda 表达式更改所有 jlabel 的文本:

holder.forEach(jlabel -> jlabel.setText(""));

注意:您的变量不应该是 JLabel,而是 MyJLabel。

在最简单的级别,您有许多对象要在 easy/accessible 容器中维护。暂时假设列表是预定义的,或者在初始化后永远不会改变大小而不需要重新初始化,数组将是一个不错的选择。

有关详细信息,请参阅 Arrays

例如...

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel[] labels = new JLabel[6];

        public TestPane() {
            setLayout(new GridLayout(0, 1));
            for (int index = 0; index < labels.length; index++) {
                JLabel label = new JLabel(Integer.toString(index));
                // Customise the label, as it' easy to type `label`
                // then `labels[index]` ;)
                add(label);
                labels[index] = label;
            }
        }

    }

}

另一方面,如果您需要更动态的东西(可以在运行时增长和收缩),那么某种 List 会更适合练习,但因为您似乎没有要理解数组,也许你应该先坚持这些。