如何在程序中自动更改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个元素,写下来的时间会很长)
创建您自己的 class 并扩展 JLabel class
构造函数启动后,将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
会更适合练习,但因为您似乎没有要理解数组,也许你应该先坚持这些。
例如
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个元素,写下来的时间会很长)
创建您自己的 class 并扩展 JLabel class
构造函数启动后,将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
会更适合练习,但因为您似乎没有要理解数组,也许你应该先坚持这些。