gpt4 book ai didi

java - 如何从其他类获取对节点的引用?

转载 作者:行者123 更新时间:2023-12-01 17:50:57 28 4
gpt4 key购买 nike

是否有任何简单的方法可以从其他类获取对舞台控制的引用?除了 Delphi 之外,这似乎是每个基于 GUI 的框架中的一个问题。如果只有 ControllerMain 类是静态的...

这是我的代码:

Controller.java:

package sample;

import javafx.fxml.*;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;

public class Controller {

@FXML
private Button algorithms;

@FXML
private Button settings;

@FXML
private Button run;

@FXML
public TextArea console; // I want access that node from class named 'Utils'

@FXML
void initialize() { }

public Controller () { }

@FXML
private void onRun() {
Utility.get().runBench();
}

@FXML
private void onSettings() {
console.appendText("I am opening settings...");
}

@FXML
private void onAlgorithm() {
console.appendText("I am opening list of Algorithms...");
}
}

Utils.java:

package sample;

import sample.Algorithms.BubbleSort;

import java.util.*;


// Singleton
public class Utility {
private static Utility ourInstance = new Utility();

public static Utility get() {
return ourInstance;
}

private Utility() {
listOfAlgorithms.add(new BubbleSort(howManyN));
}

List<Algorithm> listOfAlgorithms = new LinkedList<>();
Long howManyN = 999L;

public void runBench() {
for (Algorithm a: listOfAlgorithms) {
double start = System.nanoTime();
a.run();
double end = System.nanoTime();
double result = end - start;
System.out.println(
// console.appendText( // Accessing like that would be ideal
"Algorithm: " + a.getClass().getName() + "\n" +
"For N = " + a.getN() + " time is: " + result
);
}
}
}

我听说过FXMLLoader,但它在Main类中,所以没有区别。

Main.java:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application {

final String APP_NAME = "SortAll 2";
final String RES_PATH = "../resources/scene.fxml";

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

@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource(RES_PATH));
primaryStage.setTitle(APP_NAME);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}

最佳答案

将对象传递给runBench()方法描述了您想要对结果执行的操作。由于您将结果封装为 String ,您可以使用 Consumer<String> :

public void runBench(Consumer<String> onAlgorithmCompletion) {
for (Algorithm a: listOfAlgorithms) {
double start = System.nanoTime();
a.run();
double end = System.nanoTime();
double result = end - start;
onAlgorithmCompletion.accept(
"Algorithm: " + a.getClass().getName() + "\n" +
"For N = " + a.getN() + " time is: " + result
);
}
}

然后从你的 Controller 你可以做

@FXML
private void onRun() {
Utility.get().runBench(console::appendText);
}
<小时/>

这与您发布的问题无关,但您几乎肯定需要执行 runBench()方法在后台线程中,因为它显然需要一些时间来执行。如果这样做,您需要确保只能在 FX 应用程序线程上访问控制台。上面的解决方案很容易修改来执行此操作(您的 runBench(...) 方法根本不需要更改):

private Executor exec = Executors.newCachedThreadPool();

// ...

@FXML
private void onRun() {
exec.execute(() -> Utility.get().runBench(
result -> Platform.runLater(console.appendText(result))));
}

关于java - 如何从其他类获取对节点的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50216432/

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