我正在教我的自我java(fx),以便为我的小型企业创建一些应用程序。
但是我遇到了下面的问题。实际的程序更大更复杂,所以我创建了一个新的,更小的,更容易的眼睛类,以获得一些帮助,让我难以忍受一个多星期
下面的代码创建了3个具有不同ID的标签实例(如果它可以提供帮助)。是否有办法通过按下按钮将标签2的文字改为其他内容?
这是我找到解决方案的最后希望。
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Change Label 2 text to something else");
btn.setLayoutX(220);
btn.setLayoutY(250);
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
//????????????????????????????????????
}
});
Pane root = new Pane();
root.getChildren().add(btn);
for(int i=1; i<=3; i++){
Label label = new Label("Label "+i);
label.setId(String.valueOf(i));
label.setLayoutX(i*60);
label.setLayoutY(i*60);
root.getChildren().add(label);
}
Scene scene = new Scene(root, 600, 500);
primaryStage.setTitle("Instances");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:2)
在类级别创建对组件的引用。例如,您可以创建标签组件数组
private Label[] labels;
并初始化
labels = new Label[3];
for (int i = 0; i < labels.length; i++) {
labels[i] = new Label("Label " + (i + 1));
...
}
然后处理程序只包含
labels[1].setText("New Text");
答案 1 :(得分:1)
您正在创建一个Label
的同一个实例三次。相反,创建Labels
数组,如下所示:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Test extends Application {
@Override
public void start(Stage primaryStage) {
Label[] labels = new Label[3];
Button btn = new Button();
btn.setText("Change Label 2 text to something else");
btn.setLayoutX(220);
btn.setLayoutY(250);
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
labels[1].setText("Text changed");
}
});
Pane root = new Pane();
root.getChildren().add(btn);
for (int i = 0; i < 3; i++) {
labels[i] = new Label("Label " + i);
labels[i].setId(String.valueOf(i));
labels[i].setLayoutX(i * 60);
labels[i].setLayoutY(i * 60);
root.getChildren().add(labels[i]);
}
Scene scene = new Scene(root, 600, 500);
primaryStage.setTitle("Instances");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
其他注意事项:请勿按照以下方式放置您的组件:
label.setLayoutX(i*60);
label.setLayoutY(i*60);
使用适当的窗格进行布局。
答案 2 :(得分:1)
Reimeus和Branislav的答案(存储对您希望在Java中操作的标签的显式引用)是首选解决方案。
此答案仅作为备用对位信息提供。
使用CSS ID和查找
您可以使用css ID和lookup函数来获取对节点的引用。
实施例
例如,您正在创建如下标签:
for(int i=1; i<=3; i++){
Label label = new Label("Label "+i);
label.setId(String.valueOf(i));
. . .
root.getChildren().add(label);
}
你可以把你的第二个标签变成这样的突变忍者龟:
btn.setOnAction(event -> {
Label label = (Label) btn.getScene().lookup("#2");
label.setText("Turtle Power");
label.setGraphic(
new ImageView(
new Image(
"http://www.cavemag.com/wp-content/uploads/2011/12/teenage-mutant-ninja-turle-toys.jpg",
64, 0, true, true
)
)
);
});
按下按钮操作标签后:
优点和缺点
优点是:
缺点是:
通常,缺点将超过使用查找的优势。
查找方法适用于动态语言,例如在复杂的非结构化html文档上执行的JavaScript(使用jQuery之类的东西)。但JavaFX并不是理想的,因为Java是静态类型的,这有利于类型分辨率,也因为场景图设置通常比典型的HTML应用程序更具结构性。