2016-11-08 103 views
1

我无法从其他类更改我的标签的文本。 我需要不断更新主屏幕上的日期和时间,同时我也可以同时执行其他功能。我已经使用了一个TimeSetting类,该类扩展了Thread,并且在它的run()方法中,我使用setText()在无限循环中调用了updation命令,然后再睡一会儿。 但在运行此,没有任何反应和关闭输出窗口,我得到一个错误NullPointerExcpetion来自javafx-fxml中不同类的常量标签更新

下面是两个类的代码: FXMLDocumentController.java

package crt; 

import java.io.IOException; 
import java.net.URL; 
import java.util.Date; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class FXMLDocumentController extends Thread implements Initializable  
{ 
@FXML 
protected Label check; 
@FXML 
**protected Label date;** 
@FXML 
protected Label time; 
@FXML 
protected Label RRRR; 
@FXML 
protected Label DDDD; 
@FXML 
protected Label SSSS; 
@FXML 
protected Label temp; 
@FXML 
protected Label maxtemp; 
@FXML 
protected Label mintemp; 

@FXML 
private void handleButtonAction(ActionEvent event) throws IOException { 
     //dc.setDate(date.textProperty().bind(valueproperty)); 

     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 
     Stage stage = new Stage(); 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.initStyle(StageStyle.UNDECORATED); 
     stage.setTitle("MENU"); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
} 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
} 

FXMLDocument.fxml

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ProgressBar?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Text?> 

<AnchorPane id="AnchorPane" prefHeight="367.0" prefWidth="510.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="crt.FXMLDocumentController"> 
<children> 
    <Button fx:id="button" layoutX="387.0" layoutY="302.0" minHeight="25.0" minWidth="80.0" onAction="#handleButtonAction" onTouchPressed="#handleButtonAction" text="Menu" /> 
    <Label fx:id="date" layoutX="56.0" layoutY="64.0" minHeight="25.0" minWidth="80.0" /> 
    <Label fx:id="time" layoutX="361.0" layoutY="64.0" minHeight="25.0" minWidth="80.0" text="S" /> 
    <Label fx:id="RRRR" layoutX="76.0" layoutY="100.0" minHeight="25.0" minWidth="70.0" /> 
    <Label fx:id="DDDD" layoutX="195.0" layoutY="100.0" minHeight="25.0" minWidth="70.0" /> 
    <Label fx:id="SSSS" layoutX="314.0" layoutY="100.0" minHeight="25.0" minWidth="70.0" /> 
    <Text layoutX="136.0" layoutY="163.0" strokeType="OUTSIDE" strokeWidth="0.0" text="TEMP :-" /> 
    <Label fx:id="temp" layoutX="275.0" layoutY="156.0" minHeight="25.0" minWidth="70.0" text="A" /> 
    <Text layoutX="136.0" layoutY="203.0" strokeType="OUTSIDE" strokeWidth="0.0" text="MAX TEMP :-" /> 
    <Label fx:id="maxtemp" layoutX="275.0" layoutY="188.0" minHeight="25.0" minWidth="70.0" text="B" /> 
    <Text layoutX="136.0" layoutY="243.0" strokeType="OUTSIDE" strokeWidth="0.0" text="MIN TEMP :-" /> 

    <Label fx:id="maxtemp" layoutX="275.0" layoutY="225.0" minHeight="25.0" minWidth="70.0" text="C" /> 
    <ProgressBar layoutX="401.0" layoutY="21.0" prefHeight="18.0" prefWidth="70.0" progress="0.0" /> 
    <Button fx:id="startbutton" layoutX="14.0" layoutY="18.0" mnemonicParsing="false" onAction="#startstart" text="START" /> 
    <Label fx:id="check" layoutX="42.0" layoutY="306.0" /> 

</children> 
</AnchorPane> 

Tim eSetting.java

package crt; 
import java.util.Date; 
public class TimeSetting extends Thread { 
@Override 
public void run() 
{ 
    FXMLDocumentController fdc = new FXMLDocumentController(); 
//  fdc.load(); 
    int i=0; 
    while(true) 
    { 
     Date d = new Date(); 
     fdc.date.setText("fd" + i); 
     i++; 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch(InterruptedException e) 
     { 
     } 
    } 
} 
} 

CRT.java

package crt; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class CRT extends Application { 

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

    Scene scene = new Scene(root); 

    stage.setScene(scene); 
    stage.show(); 
} 


public static void main(String[] args) throws InterruptedException { 
    launch(args); 
    TimeSetting ts = new TimeSetting(); 
    ts.start(); 
} 

} 
+0

我在Netbeans中输入了您的代码,它显示您命名了两个标签maxtemp。我认为应该命名为mintemp。另外,该程序正在寻找一种启动按钮处理方法。如果您的代码可以编译,您是如何确定您的问题与标签有关的? – Sedrick

回答

0

launch()没有完成,直到Application退出。你应该在应用程序的start方法中启动线程。

此外new FXMLDocumentController()显然创建了一个控制器类的新实例 - 一个没有连接到任何fxml,所以没有任何字段被注入。有关与控制器通信的更多信息,请访问:Passing Parameters JavaFX FXML

此外,如果您得到此工作,您仍然使用与JavaFX应用程序线程不同的线程来修改UI。这不应该做。请使用Platform.runLater来更新UI:

while(true) { 
    Date d = new Date(); 

    final String text = "fd" + i; 
    Platform.runLater(() -> { 
     fdc.date.setText(text); 
    }); 

    i++; 
    try { 
     Thread.sleep(1000); 
    } catch(InterruptedException e) { 
    } 
}