如何设置实例化标签的文本?

时间:2014-08-16 21:53:06

标签: java javafx labels instances

我正在教我的自我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);
}

}

3 个答案:

答案 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 
           )
        )
    );
});

按下按钮操作标签后:

turtle power

优点和缺点

优点是:

  1. 您不需要在应用程序中对要操作的场景节点进行显式Java引用,如果您的代码中有一个松散耦合的逻辑设计,这将非常有用。
  2. 查找可以使用强大的CSS选择器返回一个或多个节点。
  3. 缺点是:

    1. 你失去了类型安全。
    2. 您没有编译器检查和IDE帮助,以确保查找ID实际上与CSS ID匹配。
    3. 查找是时间敏感的,必须在执行CSS布局传递后执行。
    4. 通常,缺点将超过使用查找的优势。

      查找方法适用于动态语言,例如在复杂的非结构化html文档上执行的JavaScript(使用jQuery之类的东西)。但JavaFX并不是理想的,因为Java是静态类型的,这有利于类型分辨率,也因为场景图设置通常比典型的HTML应用程序更具结构性。