gpt4 book ai didi

java - 在 javafx 8 中设置和使用时间线之外的变量

转载 作者:行者123 更新时间:2023-12-01 22:47:52 25 4
gpt4 key购买 nike

我正在尝试编写一个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 作为应用程序类的字段:

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) 而不是比较对象标识 (==/!=).

此外,如果您使用 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

关于java - 在 javafx 8 中设置和使用时间线之外的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082220/

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