一次迭代多个标签上的更改

时间:2018-12-17 11:47:36

标签: java

我试图在程序中创建一个函数,该函数将读取一个字符串,然后将页面上的每个jlabel设置为该字符串。我知道.setText();但我打算一次对100个标签进行处理。使用下面的代码,我打算使用for循环并多次调用该方法,直到有标签并在函数内发送标签名称为止。即

======= Joined =======
Constructor value is 99
Actual value is 99
The value is 99

=== JoinedDerivedA ===
Constructor value is 99
Actual value is 0 // <-- unexpected behaviour
The value is 0

=== JoinedDerivedB ===
Constructor value is 99
Actual value is 99
The value is 99

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

button.pressed() {
    updateLabel(labelName);
}

public void updateLabel(String name) {
    …
}

2 个答案:

答案 0 :(得分:1)

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

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

我认为通常情况下,面板上有很多组件和一些标签。因此 使用for (Component component : getComponents()) {}并不是最佳解决方案。

如果要为所有标签设置相同的文本,则最好创建一个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;
    }

答案 1 :(得分:0)

这是一个潜在的问题:

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

由于大多数Swing组件都没有设置name属性,除非编码员明确地设置了 ,并且我想知道这是否是NullPointerException的来源。

最好做:

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

所以是的,您可以递归地遍历GUI上所有容器中包含的所有组件,检查每个instanceof JLabel是否为List<JLabel> labels = new ArrayList<>(); ,然后进行转换和设置,但是……不,这并不干净,不好。

为什么不简单地将JLabels放入诸如

的集合中
JList<String>

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

....还是不知道您是否要使用其他组件来显示您的字符串,例如export let routes: Routes = [ { path: '', component: exampleComponent, children: [ { path: '', component: SettingsComponent } } ]