【发布时间】:2018-06-24 11:57:12
【问题描述】:
我有一个使用场景构建器的小型 javafx 应用程序,单击按钮时应定期从 COM 端口读取字符串并在文本字段中更新。
但现在如果我使用 for 循环,它只显示最后一个字符串,如果我将代码放入无限循环,则什么都不会显示(这是我的临时要求)。
谁能帮助我,以便在每次从 COM 端口读取时,文本字段中的新字符串都会更新。
这是我用于这两种情况的代码:
注意:在控制器类的这两种情况下,我都在控制台上获得了完美的输出。
public class Main extends Application
{
@Override
public void start(Stage primaryStage)
{
try
{
Parent root = FXMLLoader.load(getClass().getResource("test.fxml"));
Scene scene = new Scene(root);
//scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setTitle("test");
primaryStage.setScene(scene);
primaryStage.show();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
launch(args);
}
}
这是控制器类:
// In this case it shows only the last string in the text field.
public class Controller implements Initializable
{
@FXML
private Button sayHelloButton;
@FXML
private TextField helloField;
@Override
public void initialize(URL arg0, ResourceBundle arg1)
{
}
@FXML
public void printHello(ActionEvent event)
{
if(event.getSource() == sayHelloButton)
{
SerialPort serialPort = new SerialPort("COM22");
for(int i=0;i<5;i++)
{
try
{
if(!serialPort.isOpened())
{
serialPort.openPort();
serialPort.setParams(9600, 8, 1, 0);
}
String str = serialPort.readString(10,3000);
System.out.println(str);
helloField.clear();
helloField.setText(str);
}
catch(Exception e)
{
helloField.setText(e.toString());
}
}
}
}
}
这里是无限循环的方法:
//this shows nothing in the text field
@FXML
public void printHello(ActionEvent event)
{
if(event.getSource() == sayHelloButton)
{
SerialPort serialPort = new SerialPort("COM22");
while(true)
{
try
{
if(!serialPort.isOpened())
{
serialPort.openPort();
serialPort.setParams(9600, 8, 1, 0);
}
String str = serialPort.readString(10,3000);
System.out.println(str);
helloField.clear();
helloField.setText(str);
}
catch(Exception e)
{
helloField.setText(e.toString());
}
}
}
}
【问题讨论】:
-
应用程序的运行速度有多快?如果它执行得很快,你可能永远不会看到更新的
TextField,直到最后一个循环...... -
如果我没听错的话,情况并非如此,因为,是的,应用程序会立即运行,但我已将 COM 端口编程为以 1.5 秒的间隔发送数据,并将超时设置为读取为 3 秒。所以我认为我不会错过文本字段中的任何更新。我还做了 sysout 字符串,它以 1.5 秒的定期间隔在 Eclipse 控制台上打印。
-
在下面查看我的答案;在循环完成之前,循环可能仍在阻止对 JavaFX 应用程序线程的更新,因此只显示最后一个结果。
-
是的,循环阻塞了对应用程序线程的更新。所以我只能看到
for循环的最后一个值。在while循环中,它甚至没有显示最后一个,因为它是无限的,所以最后一个永远不会出现。我会尝试解决方案并通知您
标签: javafx scenebuilder