2

在 Java 应用程序 UI 中,有 10 个带有名称的标签:

mainLabel1
mainLabel2
...
mainLabel10

和一个原始变量(整数):

int x = 4;

假设“x”值随着应用程序的执行而变化,因此该值是未知的。在某一时刻,应用程序需要将其中一个标签的可见性更改为 true:

mainLabelX.setVisible(true);

问题 是否有使用 'x' 的值(例如 4)作为标签名称的最后一部分的简单/简单的解决方案,以便对 setVisible 的调用如下所示:

mainLabelX.setVisible(True);

'x' 变量的值可以用作标签名称的一部分吗?目前,我使用了很多 if 语句,它绝对不是唯一/最好的解决方案。

4

3 回答 3

4

在任何情况下,您都必须检查哪个 Label 满足条件,因此您需要一个Map<Integer, Label>

Map<Integer, Label> labelMap = new HashMap<Integer, Label>():
...

Label l = map.get(x);
l.setVisible(true);

如果您将所有标签命名为:mainLabel1mainLabel2您应该向它们添加一个字段名称,将它们保存在 a 中List并对其进行迭代以获得正确的List

List<Label> list = new ArrayList<>();

for(Label l: list){
   if(label.getName().equals("aName"))
   l.setVisible(true);
}

我不认为后者是一个优雅的解决方案。

于 2013-09-06T10:25:24.437 回答
3

您对 JLabels 的引用和这些标签的名称感到困惑。您可以在运行时动态更改标签的名称 - 添加/附加您想要的任何内容。但是参考文献完全不同。

在您的情况下,您有 10 个标签。所以制作一个包含 10 个 JLabel 的数组。

    JLabel[] myLabels = new JLabel[10];
    int i = 0;
    for(JLabel label : myLabels) {
        label = new JLabel();
        label.setName("label" + i);  //here i can be dynamically changed at runtime
        i++;
    }

只是为了澄清

mainLabelX.setVisible(True);

在上面的 mainLabelX 不是标签名称,而是指向您的 JLabel 对象的引用名称。如上所述,您可以使用数组。

更新:

根据上述接受的答案,我提出了一个略有不同的解决方案。

您可以很好地将不断变化的数字附加到标签上,而不是维护地图。请注意,映射是静态的,这意味着如果您的数字是 4,那么其中包含 4 的标签必须可见。因此,您可以遍历标签数组并根据您的设计要求设置其可见性,其名称包含您的编号。

        if(label.getName().contains(String.valueOf(yourInteger))) {
            label.setVisible(true);
        }

我的建议是final private prefix为您的标签名称制作一个。然后在创建标签时简单地添加数字。

    private final String labelPrefix = "label";
    for(JLabel label : myLabels) {
        label = new JLabel();
        label.setName(labelPrefix + i);
        i++;
    }
于 2013-09-06T10:24:30.707 回答
1

您可以使用List<DefaultKeyValue>或使用反射,您可以为变量调用 getter 或 setter 方法。

对于反射有很多例子如何使用: http ://tutorials.jenkov.com/java-reflection/index.html

于 2013-09-06T10:23:27.017 回答