如何在Java(JavaFX)中使用另一个类中的Label



我需要使用在JavaFx应用程序的另一个类中创建的Label

这是我的代码:主要类别

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Scanner;
public class Main extends Application {
Stage window;
Scene scene1, scene2, scene3;
private Scanner x;
@Override
public void start(Stage primaryStage) throws Exception {
readTutor r = new readTutor();
window = primaryStage;
window.setTitle("Tutor Finder");
Label labelA1 = new Label("Welcome to the best online tutornproviding service in the world");
Button buttonA2 = new Button("Find a tutor!");
Button buttonA1 = new Button("Become a tutor!");
Button buttonB1 = new Button("Click here to go back");
Button buttonB2 = new Button("Submit");
Button buttonC1 = new Button("Click here to go back");
buttonB1.setOnAction(e -> window.setScene(scene1));
buttonC1.setOnAction(e -> window.setScene(scene1));
buttonA1.setOnAction(e -> window.setScene(scene2));
buttonA2.setOnAction(e -> window.setScene(scene3));
Label labelB1 = new Label("First Name:");
TextField textB1 = new TextField();
Label labelB2 = new Label("Last Name:");
TextField textB2 = new TextField();
Label labelB3 = new Label("Subject:");
TextField textB3 = new TextField();
Label labelB4 = new Label("Age:");
TextField textB4 = new TextField();
Label labelB5 = new Label("Contact No#:");
TextField textB5 = new TextField();
Label labelB6 = new Label("Country: ");
TextField textB6 = new TextField();
VBox layout = new VBox(20);
layout.setAlignment(Pos.CENTER);
layout.getChildren().addAll(labelA1, buttonA1, buttonA2);
scene1 = new Scene(layout, 300, 300);
VBox layout2 = new VBox(20);
layout2.getChildren().addAll(labelB1, textB1, labelB2, textB2, labelB3,
textB3, labelB4, textB4, labelB5, textB5, labelB6, textB6, buttonB2, buttonB1);
buttonB2.setOnAction(l -> {
try {
BufferedWriter bw = new BufferedWriter(
new FileWriter("C:\Users\Salman\Desktop\Tutor Details\output.txt", true));
bw.write(textB1.getText()+" ");
bw.write(textB2.getText()+" ");
bw.write(textB3.getText()+" ");
bw.write(textB4.getText()+" ");
bw.write(textB5.getText()+" ");
bw.write(textB6.getText()+" n");
bw.close();
textB1.clear();
textB2.clear();
textB3.clear();
textB4.clear();
textB5.clear();
textB6.clear();
} catch (Exception e) {
return;
}
r.openFile();
r.readFile();
r.closeFile();
});
scene2 = new Scene(layout2, 400, 600);
VBox layout3 = new VBox(20);
layout3.setAlignment(Pos.CENTER);
layout3.getChildren().addAll(buttonC1);
scene3 = new Scene(layout3, 300, 300);
window.setScene(scene1);
window.show();
}
public static void main (String[]args){
launch(args);
}
}

readTutor类

import javafx.scene.control.Label;
import java.io.*;
import java.util.*;
public class readTutor {
private Scanner x;
public Label tutorLabel;
public void openFile(){
try {
x = new Scanner(new File("C:\Users\Salman\Desktop\Tutor Details\output.txt"));
}
catch(Exception e){
System.out.println("couldn't find file");
}
}
public void readFile(){
while(x.hasNext()){
String a = x.next();
String b = x.next();
String c = x.next();
String d = x.next();
String e = x.next();
String f = x.next();
System.out.printf("%s %s %s %s %s %sn", a, b, c, d, e, f);
tutorLabel = new Label(a+b+c+d+e+f);
}
}

public void closeFile(){
x.close();
}
}

我想要的是在场景3中使用在readTutor类的readFile方法中创建的Label,并在那里显示该标签。但是我不知道如何使用Main类中的标签。

您应该创建一个Object来存储您的数据或将它们传递到目标位置。

问题中的代码结构有很多非常错误的地方。大多数情况下,它在FXAT上执行各种文件处理和I/O,如果这些操作有任何滞后,就会对GUI造成严重破坏。

此外,拥有一个带有JavaFX屏幕节点的文件处理助手类的想法确实不是一个好的设计@Kleopatra关于使用数据模型的评论完全切中要害。

但是,为了回答将屏幕布局暴露给其他有正当理由访问它的类的问题,我对代码进行了必要的更改,使其能够工作。

首先,我在主屏幕上添加了一个TextField和Label,以显示readTutor类的结果。然后我将TextField传递给它的构造函数中的readTutor:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Scanner;
public class LabelPasser extends Application {
Stage window;
Scene scene1, scene2, scene3;
private Scanner x;
@Override
public void start(Stage primaryStage) throws Exception {
window = primaryStage;
window.setTitle("Tutor Finder");
Label labelA1 = new Label("Welcome to the best online tutornproviding service in the world");
Button buttonA2 = new Button("Find a tutor!");
Button buttonA1 = new Button("Become a tutor!");
Button buttonB1 = new Button("Click here to go back");
Button buttonB2 = new Button("Submit");
Button buttonC1 = new Button("Click here to go back");
buttonB1.setOnAction(e -> window.setScene(scene1));
buttonC1.setOnAction(e -> window.setScene(scene1));
buttonA1.setOnAction(e -> window.setScene(scene2));
buttonA2.setOnAction(e -> window.setScene(scene3));
Label labelB1 = new Label("First Name:");
TextField textB1 = new TextField();
Label labelB2 = new Label("Last Name:");
TextField textB2 = new TextField();
Label labelB3 = new Label("Subject:");
TextField textB3 = new TextField();
Label labelB4 = new Label("Age:");
TextField textB4 = new TextField();
Label labelB5 = new Label("Contact No#:");
TextField textB5 = new TextField();
Label labelB6 = new Label("Country: ");
TextField textB6 = new TextField();
Label labelTutor = new Label("Tutor: ");
TextField tutorTF = new TextField();
VBox layout = new VBox(20);
layout.setAlignment(Pos.CENTER);
layout.getChildren().addAll(labelA1, buttonA1, buttonA2);
readTutor r = new readTutor(tutorTF);
scene1 = new Scene(layout, 300, 300);
VBox layout2 = new VBox(20);
layout2.getChildren()
.addAll(labelB1,
textB1,
labelB2,
textB2,
labelB3,
textB3,
labelB4,
textB4,
labelB5,
textB5,
labelB6,
textB6,
labelTutor,
tutorTF,
buttonB2,
buttonB1);
buttonB2.setOnAction(l -> {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\Users\Salman\Desktop\Tutor Details\output.txt", true));
bw.write(textB1.getText() + " ");
bw.write(textB2.getText() + " ");
bw.write(textB3.getText() + " ");
bw.write(textB4.getText() + " ");
bw.write(textB5.getText() + " ");
bw.write(textB6.getText() + " n");
bw.close();
textB1.clear();
textB2.clear();
textB3.clear();
textB4.clear();
textB5.clear();
textB6.clear();
} catch (Exception e) {
return;
}
r.openFile();
r.readFile();
});
scene2 = new Scene(layout2, 400, 600);
VBox layout3 = new VBox(20);
layout3.setAlignment(Pos.CENTER);
layout3.getChildren().addAll(buttonC1);
scene3 = new Scene(layout3, 300, 300);
window.setScene(scene1);
window.show();
}
public static void main(String[] args) {
launch(args);
}
}

然后,我修改了readTutor,使其不再创建Label,而是更新它在构造函数中接收到的TextField的Text属性

import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import java.io.File;
import java.util.Scanner;
public class readTutor {
private Scanner x;
public Label tutorLabel;
TextField tutorTF;
public readTutor(TextField tutorTF) {
this.tutorTF = tutorTF;
}
public void openFile() {
try {
x = new Scanner(new File("C:\Users\Salman\Desktop\Tutor Details\output.txt"));
} catch (Exception e) {
System.out.println("couldn't find file");
}
}
public void readFile() {
while (x.hasNext()) {
String a = x.next();
String b = x.next();
String c = x.next();
String d = x.next();
String e = x.next();
String f = x.next();
System.out.printf("%s %s %s %s %s %sn", a, b, c, d, e, f);
tutorTF.setText(a + b + c + d + e + f);
}
}
}

事实证明,如果您使用Task以应有的方式对文件进行处理编程,那么关于标签传递的大多数问题都将变得毫无意义。我已经清理了一些代码,使其更容易阅读,然后将文件处理拆分为一个任务:

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Scanner;
public class LabelPasser extends Application {
Stage window;
Scene scene1, scene2, scene3;
private Scanner x;
private TextField textB1 = new TextField();
private TextField textB2 = new TextField();
private TextField textB3 = new TextField();
private TextField textB4 = new TextField();
private TextField textB5 = new TextField();
private TextField textB6 = new TextField();
private TextField tutorTF = new TextField();
@Override
public void start(Stage primaryStage) throws Exception {
window = primaryStage;
window.setTitle("Tutor Finder");
Button buttonA2 = new Button("Find a tutor!");
Button buttonA1 = new Button("Become a tutor!");
Button buttonB1 = new Button("Click here to go back");
Button buttonB2 = new Button("Submit");
Button buttonC1 = new Button("Click here to go back");
buttonB1.setOnAction(e -> window.setScene(scene1));
buttonC1.setOnAction(e -> window.setScene(scene1));
buttonA1.setOnAction(e -> window.setScene(scene2));
buttonA2.setOnAction(e -> window.setScene(scene3));
VBox layout = new VBox(20, new Label("Welcome to the best online tutornproviding service in the world"), buttonA1, buttonA2);
layout.setAlignment(Pos.CENTER);
scene1 = new Scene(layout, 300, 300);
VBox layout2 = new VBox(20);
layout2.getChildren()
.addAll(new Label("First Name:"),
textB1,
new Label("Last Name:"),
textB2,
new Label("Subject:"),
textB3,
new Label("Age:"),
textB4,
new Label("Contact No#:"),
textB5,
new Label("Country: "),
textB6,
new Label("Tutor: "),
tutorTF,
buttonB2,
buttonB1);
buttonB2.setOnAction(evt -> buttonAction());
scene2 = new Scene(layout2, 400, 600);
VBox layout3 = new VBox(20);
layout3.setAlignment(Pos.CENTER);
layout3.getChildren().addAll(buttonC1);
scene3 = new Scene(layout3, 300, 300);
window.setScene(scene1);
window.show();
}
private void buttonAction() {
Task<String> fileTask = new Task<String>() {
@Override
protected String call() throws Exception {
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\Users\Salman\Desktop\Tutor Details\output.txt", true));
bw.write(textB1.getText() + " ");
bw.write(textB2.getText() + " ");
bw.write(textB3.getText() + " ");
bw.write(textB4.getText() + " ");
bw.write(textB5.getText() + " ");
bw.write(textB6.getText() + " n");
bw.close();
textB1.clear();
textB2.clear();
textB3.clear();
textB4.clear();
textB5.clear();
textB6.clear();
} catch (Exception e) {
return "";
}
ReadTutor readTutor = new ReadTutor();
readTutor.openFile();
return readTutor.readFile();
}
};
fileTask.setOnSucceeded(evt -> tutorTF.setText(fileTask.getValue()));
Thread fileThread = new Thread(fileTask);
fileThread.start();
}

public static void main(String[] args) {
launch(args);
}
}

ReadTutor中的readFile((方法很奇怪,看起来它试图在循环中创建Labels,所以文件读取很奇怪。我修改它只是为了编译:

import java.io.File;
import java.util.Scanner;
public class ReadTutor {
private Scanner x;
public void openFile() {
try {
x = new Scanner(new File("C:\Users\Salman\Desktop\Tutor Details\output.txt"));
} catch (Exception e) {
System.out.println("couldn't find file");
}
}
public String readFile() {
String results = "";
while (x.hasNext()) {
String a = x.next();
String b = x.next();
String c = x.next();
String d = x.next();
String e = x.next();
String f = x.next();
System.out.printf("%s %s %s %s %s %sn", a, b, c, d, e, f);
results = a + b + c + d + e + f;
}
return results;
}
}

因此,现在您可以看到ReadTutor只是一个文件处理程序,因此它返回了一个普通的旧Java字符串,对JavaFX一无所知。Task处理后台线程上的活动,并从读取操作返回String值。当Task完成时,它将触发OnSuccessed事件,该事件将更新FXAT上tutorTF TextField中的值。

最新更新