I'm編程的工具應該能夠連續記錄字符串到一個TextArea。 Controller類有一個簡單的方法setText();那會將字符串附加到TextArea。我的問題:我不能讓控制器經常監視我的日誌記錄類,因爲這會使GUI不可用。在我的眼裏,唯一的解決辦法是某種方式得到存取權限的文本區域或控制器的外部setText()方法。這是可能的,我需要做什麼我的日誌記錄類獲取訪問控制器方法?JavaFX的:如何從一個普通的Java類訪問cotroller方法?
0
A
回答
0
我不知道爲什麼你的控制器應看你的日誌類?爲任何耗時的工作運行單獨的線程 - 直接從您的新線程記錄。您可以從任何線程訪問GUI組件,但如果你使用的是像任何的JavaFX GUI框架,確保讓GUI的時間來處理與運行後類型的事情你的迴應:正如你所看到的,這會不會影響你的迴應時間在GUI前端,讓您遠離事件派發線程。
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.Date;
import java.util.concurrent.Executors;
public class LogThing extends Application {
private TextField textField;
private TextField textField2;
private Button clickMeBtn;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Logger!");
textField = new TextField();
textField2 = new TextField();
clickMeBtn = new Button("Click me for time");
clickMeBtn.setOnAction(e -> {
textField2.setText(new Date().toString());
});
StackPane root = new StackPane();
VBox vBox = new VBox();
vBox.getChildren().addAll(textField2, clickMeBtn, textField);
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
Executors.newSingleThreadExecutor().submit(new BackGroundTask(this));
}
public void logALine(String line) {
textField.setText(line);
}
class BackGroundTask implements Runnable {
private final LogThing logThing;
private int i = 1;
public backGroundTask(LogThing logThing) {
this.logThing = logThing;
}
@Override
public void run() {
while (true) {
for (i = 1; i < 1000; i++) {
try {
Thread.sleep(1000);
Platform.runLater(new Runnable() {
@Override
public void run() {
logThing.logALine("i : " + i);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
0
你應該閱讀有關JavaFX的性能。隨着的JavaFX屬性可以通過「觀察」「外部」屬性的值,並將其綁定到一個可視化的控制。你也應該考慮使用列表控件而不是textarea
。這是一個簡短的代碼片段。
模型類:
StringProperty someString = new SimpleStringProperty(""); // etc...
控制器類:
textField.textProperty().bind(model.someStringProperty());
https://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm
相關問題
- 1. 如何從一個普通的方法訪問類的屬性 - C#
- 2. 如何從普通的Servlet訪問VaadinSession?
- 3. 如何從另一個類的方法訪問類的變量?
- 4. 如何調用從普通的java類
- 5. 從一個普通的類方法開始新的活動
- 6. Java泛型從一個普通的方法
- 7. 從一個普通的靜態方法獲取類的名字在Java中
- 8. Android:我如何從普通的java類開始一個活動? java類是servlet
- 9. 如何從另一個片段類訪問一個方法?
- 10. Gson.toJson(),從一個普通類
- 11. Java:從父類訪問子類方法
- 12. Android:我如何從一個類的方法訪問值?
- 13. 如何從另一個類訪問超類方法?
- 14. 普通Java持久性和JavaFX表示層:類設計的方法?
- 15. 如何訪問位於Java中另一個類的另一個方法內部的類中的方法
- 16. Java - 如何從另一個方法訪問方法範圍內的ArrayList?
- 17. 我無法訪問另一個類的處理器方法? java
- 18. C#泛型 - 從一個普通類調用泛型方法
- 19. Java:你如何訪問兩個級別的父類方法?
- 20. Java:如何限制某個方法對特定類的訪問?
- 21. 如何從Java訪問JavaFX 1.3靜態類成員?
- 22. 如何從另一個類訪問變量? Android的Java的
- 23. 如何從另一個類訪問方法?
- 24. AS3:如何從另一個類訪問屬性/方法?
- 25. 如何從另一個類訪問委託方法?
- 26. 如何從其他方法訪問java中的方法?
- 27. 從Python中的另一個類訪問類方法2.7
- 28. 如何訪問JavaFx 2.0中的Controller類?
- 29. Java如何從另一個類訪問另一個ArrayList?
- 30. 從一個類到另一個類的Java訪問信息
這就是我想出了昨晚的解決方案,感謝您輸入反正!無論如何,標記你的答案是正確的。 – FlyingV 2014-11-25 00:08:44