Java 随控制台一起更新FXML应用程序

Java 随控制台一起更新FXML应用程序,java,javafx,Java,Javafx,我对Java编程相当陌生,但我想制作一个简单的向上或向下计数器(基于输入值)。我已经为我的代码创建了一个FXML应用程序,我想更新计数器。假设我想从1数到6,我想让应用程序显示1,2,3,4,5,6。我已经设法在控制台中完成了,但是FXML应用程序似乎在计数时暂停了 有人能帮我吗?以下是我的全部代码: UpOrDownCounter.java package upOrDownCounter; public class UpOrDownCounter { private int stop; p

我对Java编程相当陌生,但我想制作一个简单的向上或向下计数器(基于输入值)。我已经为我的代码创建了一个FXML应用程序,我想更新计数器。假设我想从1数到6,我想让应用程序显示1,2,3,4,5,6。我已经设法在控制台中完成了,但是FXML应用程序似乎在计数时暂停了

有人能帮我吗?以下是我的全部代码:

UpOrDownCounter.java

package upOrDownCounter;

public class UpOrDownCounter {

private int stop;
private int start;
private int counter = 0;

public UpOrDownCounter(int start, int stop){
    this.stop = stop;
    this.start = start;

    if(start > stop) {
        counter = start + 1;
    }else {
        counter = start - 1;
    }

    if(start == stop) {
        throw new IllegalArgumentException("Start and stop cannot be the same value");
    }
}

int getCounter() {
    return counter;
}

boolean count() {
    if(start > stop) {
        if(getCounter() != stop) {
            counter = counter - 1;
            return true;
        }
    }else {
        if(getCounter() != stop) {
            counter = counter + 1;
            return true;
        }
    }
    return false;
}

public static void main(String[] args) {
    UpOrDownCounter cd = new UpOrDownCounter(6, 6);
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
  }
}
package upOrDownCounter;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class UpOrDownCounterController {
UpOrDownCounter cd;

@FXML TextField startValue;
@FXML TextField stopValue;
@FXML TextField counterOutput;

@FXML
void handleClick() {
    String startString = startValue.getText();
    int start = Integer.valueOf(startString);
    String stopString = stopValue.getText();
    int stop = Integer.valueOf(stopString);

    cd = new UpOrDownCounter(start, stop);

    while(cd.count()) {
        try {
            System.out.println("Counter: " + String.valueOf(cd.getCounter()));
            counterOutput.setText(String.valueOf(cd.getCounter()));
            System.out.println(String.valueOf(cd.getCounter()));
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
      }
   }
}
UpOrDownCounterController.java

package upOrDownCounter;

public class UpOrDownCounter {

private int stop;
private int start;
private int counter = 0;

public UpOrDownCounter(int start, int stop){
    this.stop = stop;
    this.start = start;

    if(start > stop) {
        counter = start + 1;
    }else {
        counter = start - 1;
    }

    if(start == stop) {
        throw new IllegalArgumentException("Start and stop cannot be the same value");
    }
}

int getCounter() {
    return counter;
}

boolean count() {
    if(start > stop) {
        if(getCounter() != stop) {
            counter = counter - 1;
            return true;
        }
    }else {
        if(getCounter() != stop) {
            counter = counter + 1;
            return true;
        }
    }
    return false;
}

public static void main(String[] args) {
    UpOrDownCounter cd = new UpOrDownCounter(6, 6);
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
    System.out.println(cd.getCounter());
    System.out.println(cd.count());
  }
}
package upOrDownCounter;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class UpOrDownCounterController {
UpOrDownCounter cd;

@FXML TextField startValue;
@FXML TextField stopValue;
@FXML TextField counterOutput;

@FXML
void handleClick() {
    String startString = startValue.getText();
    int start = Integer.valueOf(startString);
    String stopString = stopValue.getText();
    int stop = Integer.valueOf(stopString);

    cd = new UpOrDownCounter(start, stop);

    while(cd.count()) {
        try {
            System.out.println("Counter: " + String.valueOf(cd.getCounter()));
            counterOutput.setText(String.valueOf(cd.getCounter()));
            System.out.println(String.valueOf(cd.getCounter()));
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
      }
   }
}
UpOrDownCounter.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>


<VBox xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/9" fx:controller="upOrDownCounter.UpOrDownCounterController">
 <children>
  <TextField fx:id="startValue" promptText="Start" />
  <TextField fx:id="stopValue" promptText="Stop" />
  <Button onAction="#handleClick" mnemonicParsing="false" prefHeight="37.0" prefWidth="196.0" text="Start countdown" />
  <TextField fx:id="counterOutput" prefHeight="32.0" prefWidth="196.0" />
 </children>
</VBox>

您将不得不稍微使用代码,但以下是您如何解决第一个问题。使用。用密码修改答案

//Duration.seconds(1)告诉此时间线每秒运行一次
Timeline OneSecondsUnder=新的时间线(新的关键帧(持续时间.秒(1),新的EventHandler)()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
System.out.println(“计数器:+String.valueOf(cd.getCounter()));
counterOutput.setText(String.valueOf(cd.getCounter());
System.out.println(String.valueOf(cd.getCounter());
cd.count();
}
}));
设置循环计数(启动-停止)//这会告诉时间线重复一定次数。
第二个是玩//这就开始了时间线。
完整代码

包裹上下计数器;
导入javafx.fxml.fxml;
导入javafx.scene.control.TextField;
公共类UpOrDownCounterController{
上下计数器cd;
@FXML
文本字段起始值;
@FXML
文本字段停止值;
@FXML
TextField计数器输出;
@凌驾
公共void初始化(URL位置、ResourceBundle资源)
{
}
@FXML
void handleClick()
{
字符串startString=startValue.getText();
int start=Integer.valueOf(startString);
String stopString=stopValue.getText();
int stop=Integer.valueOf(stopString);
cd=新的向上或向下计数器(启动、停止);
Timeline OneSecondsUnder=新的时间线(新的关键帧(持续时间.秒(1),新的EventHandler)()
{
@凌驾
公共无效句柄(ActionEvent事件)
{
System.out.println(“计数器:+String.valueOf(cd.getCounter()));
counterOutput.setText(String.valueOf(cd.getCounter());
System.out.println(String.valueOf(cd.getCounter());
cd.count();
if(cd.getCounter()==停止){
}
}
}));
设置循环计数(启动-停止);
第二个是玩;
}
}

Main的
JavaFX
格式似乎不正确,或者这可能是您在尝试制作
JavaFX
应用程序之前使用的代码?不要用
Thread.sleep()
阻塞FX应用程序线程(这样会阻止呈现UI)。例如,请参见,如果您在
JavaFX
项目中使用
UpOrDownCounter.java
,那么它不应该包含
main
方法。您应该澄清您的问题!您没有按照启动JavaFX应用程序所需的方式启动它,或者您没有提供所有代码。所以,我把你的问题降级了。如果您确实需要JavaFX应用程序线程的帮助,首先需要启动它。好的,要启动JavaFX应用程序,请看这里:然后,如果您编辑您的问题,我可以减少降级投票。顺便说一句,你不需要得到这么复杂的逻辑来建立一个上升或下降计数器。