作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有任何简单的方法可以从其他类获取对舞台控制的引用?除了 Delphi 之外,这似乎是每个基于 GUI 的框架中的一个问题。如果只有 Controller
或 Main
类是静态的...
这是我的代码:
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/
我是一名优秀的程序员,十分优秀!