2014-11-23 61 views
0

I'm編程的工具應該能夠連續記錄字符串到一個TextArea。 Controller類有一個簡單的方法setText();那會將字符串附加到TextArea。我的問題:我不能讓控制器經常監視我的日誌記錄類,因爲這會使GUI不可用。在我的眼裏,唯一的解決辦法是某種方式得到存取權限的文本區域或控制器的外部setText()方法。這是可能的,我需要做什麼我的日誌記錄類獲取訪問控制器方法?JavaFX的:如何從一個普通的Java類訪問cotroller方法?

回答

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

這就是我想出了昨晚的解決方案,感謝您輸入反正!無論如何,標記你的答案是正確的。 – FlyingV 2014-11-25 00:08:44

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

相關問題