【问题标题】:How do I make a textfield editable for 10 seconds on the click of a button?如何在单击按钮时使文本字段可编辑 10 秒?
【发布时间】:2017-12-04 08:28:53
【问题描述】:

使用 JavaFX,点击一个按钮我想这样做:

spinBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
    field.setDisable(false);
    //Delay for 10 seconds
    field.setDisable(true);         
    }
});

我很快意识到休眠是行不通的,因为它会完全冻结 GUI。我也尝试过休眠线程来获取计时器,但是如果在我想要延迟的地方输入,它仍然会冻结 GUI。 (下例)

spinBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
    ExampleTimerThread exampleSleepyThread = new ExampleTimerThread();//this extends Thread
    exampleSleepyThread.start(); 
//thread sleeps for 10 secs & sets public static boolean finished = true; after sleep 
    while(finished == true){
        field.setDisable(false);
        }           
    }
});

我可以做些什么来防止这段代码冻结 GUI? 我知道在 Swing 中有一个计时器。 JavaFX中是否有类似的东西?

【问题讨论】:

  • 您可以在 10 秒后从线程中尝试Platform.runLater,然后在主线程中调用一个现在禁用文本字段的函数。
  • 我认为这可以正常工作,但从我的尝试来看,它给我带来了问题,我认为必须有一种不同的、更简单的方法(在我看来),就像 MBec 的回答一样。
  • 我同意,MBec 的回答似乎更合适。

标签: java javafx java-8 javafx-8


【解决方案1】:

使用PauseTransition 延迟事件:

spinBtn.setOnAction(e -> {
    field.setDisabled(false);
    PauseTransition pt = new PauseTransition(Duration.seconds(10));
    pt.setOnFinished(ev -> {
        field.setDisabled(true);
    });
    pt.play();
});

【讨论】:

  • 我确实想补充一点,我相信 setDisable 是 JavaFX 的正确语法。当我尝试使用 setDisabled 时,它给了我一个错误。我尝试编辑它,但更改的字符太少。
  • 您遇到了什么类型的错误?或者最好再问一个问题。
  • 错误提示“来自类型节点的方法 setDisabled(boolean) 不可见”。我将其全部更改为 setDisable 并且有效。
  • 我很抱歉,我意识到我原来的问题是不正确的。我修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多