Javafx 8のタイムライン外で変数を設定および使用する
質問
システムのクリップボードを監視する Javafx アプリを作成しようとしています。
package sample;
import javafx.event.ActionEvent;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.util.Duration;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
primaryStage.show();
final Clipboard clipboard = Clipboard.getSystemClipboard();
final String oldString = "";
final String newString = "";
Timeline repeatTask = new Timeline(new KeyFrame(Duration.millis(200), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (clipboard.hasString()) {
newString = clipboard.getString();
if(oldString != newString) {
System.out.printf("String changed in clipboard: " + newString);
oldString = newString;
}
else {
System.out.println("String not changed.");
}
}
}
}));
repeatTask.setCycleCount(Timeline.INDEFINITE);
repeatTask.play();
}
public static void main(String[] args) {
launch(args);
}
}
問題は、タイムライン オブジェクトの外側にクリップボードの古いコンテンツを保存する必要があり、それらに変更を加える必要があることですが、Java の要求に従って最終コンテンツとして設定されると、変更は不可能になります。
解決
あなたが持つことができます oldString
Application クラスのフィールドとして:
private String oldString = "";
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.show();
final Clipboard clipboard = Clipboard.getSystemClipboard();
Timeline repeatTask = new Timeline(new KeyFrame(Duration.millis(200), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (clipboard.hasString()) {
String newString = clipboard.getString();
if(!oldString.equals(newString)) {
System.out.printf("String changed in clipboard: " + newString);
oldString = newString;
}
else {
System.out.println("String not changed.");
}
}
}
}));
repeatTask.setCycleCount(Timeline.INDEFINITE);
repeatTask.play();
}
これは、アクセスすると機能するため、 oldString
, 、実際にアクセスしています this.oldString
, 、 どこ this
最終的です。
文字列を比較するには、次を使用する必要があることにも注意してください。 oldString.equals(newString)
オブジェクトの ID を比較する代わりに (==
/!=
).
また、Java 8 を使用している場合は、ReactFX を使用してタイムラインのボイラープレートを削除できます。
private String oldString = "";
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.show();
final Clipboard clipboard = Clipboard.getSystemClipboard();
EventStreams.ticks(Duration.ofMillis(200)).subscribe(tick -> {
if (clipboard.hasString()) {
String newString = clipboard.getString();
if(!oldString.equals(newString)) {
System.out.printf("String changed in clipboard: " + newString);
oldString = newString;
}
else {
System.out.println("String not changed.");
}
}
});
}
ReactFX のタイマーの使用方法の詳細については、私のブログ投稿を参照してください。 http://tomasmikula.github.io/blog/2014/06/04/timers-in-javafx-and-reactfx.html
所属していません StackOverflow