同时在多个标签上迭代更改

  • 本文关键字:迭代 标签 java
  • 更新时间 :
  • 英文 :


我正在尝试在程序中创建一个函数,该函数将读取一个字符串,然后将页面上的每个jlabel都设置为该字符串。我知道.setText((;但我打算一次对100个标签这样做。使用下面的代码,我打算使用for循环,并在函数中多次调用该方法,只要我有标签并发送标签名称。即

button.pressed() {
updateLabel(labelName);
}
public void updateLabel(String name) {
…
}

但最初为了测试代码,我只是硬编码了一个标签的名称并运行它。第一次它有效,但现在我每次都会得到一个空指针异常。请有人帮忙。下面的实际代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
labeltest(); 
}                                        
public void labeltest() {
for (Component c : this.getContentPane().getComponents()) {
if (c.getName().equals("Jlabel")) {
// do the modifications...
((JLabel) c).setText("Updated");
}
}
}

默认情况下,Component.namenull,因此要仅选择标签,应使用instance of:

private void updateLabels(String str) {
for (Component component : getContentPane().getComponents())
if (component instanceof JLabel)
((JLabel)component).setText(str);
}

我认为在一般情况下,面板上有很多组件和一些标签。因此使用CCD_ 4不是最好的解决方案。

如果你想为所有标签设置相同的文本,那么最好创建一个包含所有应该更新的标签的List<JLabel>,并设置一个文本:

private final List<JLabel> labels = new ArrayList<>();
private void init() {
add(createLabel());
}
// hide add to labels within create method
private JLabel createLabel() {
JLabel label = new JLabel():
labels.add(label);
return label;
}

如果你想为标签设置不同的文本,那么最好为标签设置正确的名称,并对所有标签使用Map<String, JLabel>

private final Map<String, JLabel> labels = new HashMap<>();
private final static String NAME_ACCOUNT = "account";
private final static String NAME_SCORE = "score";
private void int() {
add(createLabel(NAME_ACCOUNT));
add(createLabel(NAME_SCORE);
}
// hide add to labels within create method
private JLabel createLabel(String name) {
JLabel label = new JLabel():
label.setName(name);
labels.put(name, label);
return label;
}

这里有一个潜在的问题:

if (c.getName().equals("Jlabel")) {

因为大多数Swing组件都没有name属性集,除非你,编码者,显式地设置它,我不得不怀疑这是否是NullPointerException的来源。

更好的做法:

if (c instanceof JLabel) {
// ....
}

因此,是的,您可以递归地遍历GUI上所有容器中的所有组件,检查每个组件是否为instanceof JLabel,然后进行强制转换和设置,但是。。。不,这不干净,不好。

为什么不简单地将JLabels放入这样的集合中呢

List<JLabel> labels = new ArrayList<>();

然后使用for循环,遍历列表并更改标签的状态。

或者我想知道您是否希望使用其他组件来显示您的字符串,例如JList<String>

最新更新