gpt4 book ai didi

java - 添加 FXML 中定义的元素以循环列出

转载 作者:行者123 更新时间:2023-11-29 09:47:22 27 4
gpt4 key购买 nike

我有很多名称为 a1, a2, a3, ...我需要将它们放入列表中,以便使用它们更简单,我会以某种方式使用循环来完成吗?

我的尝试是:

List<SomeObject> list = new LinkedList<SomeObject>();
for (int i=0; i<1000; i++){
String varName = "a"+i;
list.add((SomeObject) varName);
}

有人对这种情况有什么建议吗?在循环内创建变量不是解决方案,因为它们是 .fxml 文档的一部分。或者给我一个如何使用循环创建它的建议,因为它在 .fxml 中创建与在循环中添加新对象并行的行。

为了更易于理解,.fxml 文件看起来像

  <SomeObject fx:id="a1" *other props* />
<SomeObject fx:id="a2" *other props* />
<SomeObject fx:id="a3" *other props* />
<SomeObject fx:id="a4" *other props* />

多谢指教!

最佳答案

如果您有那么多项目,最好使用 Java 来初始化它们,而不是使用 FXML。例如,而不是:

<FlowPane fx:id="container" minWidth="..." minHeight="...">
<Label fx:id="label1" text="Label 1"/>
<Label fx:id="label2" text="Label 2"/>
<Label fx:id="label3" text="Label 3"/>

<!-- ... -->

<Label fx:id="label1000" text="Label 1000"/>
</FlowPane>

和一个 Controller

public class Controller {

@FXML
private FlowPane container ;
@FXML
private Label label1 ;
@FXML
private Label label2 ;
// ...

@FXML
private Label label1000 ;

// ...
}

我愿意

<FlowPane fx:id="container" minWidth="..." minHeight="...">
</FlowPane>

public class Controller {

@FXML
private FlowPane container ;

private List<Label> labels ;

public void initialize() {
labels = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
Label label = new Label("Label "+i);
labels.add(label);
container.getChildren().add(label);
}
}
}

作为这个想法的变体,考虑定义一个自定义组件:

public class LabelFlow extends FlowPane {

private List<Label> labels ;

public LabelFlow(@NamedArg("numLabels") int numLabels) {
labels = new ArrayList<>();
for(int i = 1 ; i <= numLabels ; i++) {
Label label = new Label("Label "+i);
labels.add(label);
}
getChildren().addAll(labels);
}

public List<Label> getLabels() {
return Collections.unmodifiableList(labels);
}
}

现在在您的 FXML 中

<LabelFlow fx:id="labelFlow" numLabels="1000"/>

在你的 Controller 中

public class Controller {
@FXML
private LabelFlow labelFlow ;

public void initialize() {
for (Label label : labelFlow.getLabels()) {
// do whatever you need with label....
}
}
}

如果您想在 Scene Builder 中使用自定义类,则需要跳过几个步骤。参见 Adding a custom component to SceneBuilder 2.0

如果您真的想要在 FXML 中定义所有这些控件,在我看来这将是一场维护噩梦,您可以使用反射来访问变量。我不推荐这样做,不仅因为它难以维护,还因为反射本质上很容易出错(没有编译时检查)并且很复杂。

但你可以这样做

public class Controller {

@FXML
private FlowPane container ;
@FXML
private Label label1 ;
@FXML
private Label label2 ;
// ...

@FXML
private Label label1000 ;

private List<Label> labels ;

public void initialize() throws Exception {
labels = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
Field field = getClass().getDeclaredField("label"+i);
boolean wasAccessible = field.isAccessible();
field.setAccessible(true);
Label label = (Label) field.get(this);
field.setAccessible(wasAccessible);
labels.add(label);
}
}
}

关于java - 添加 FXML 中定义的元素以循环列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com