我通过使用模型视图控制器在JavaFX FXML中有一个应用程序。我想用键盘移动一些滑块。为此,我在主类中放置了一个KeyEvent来了解键盘上发生的情况。在控制器类FXMLDocumentController中,其中是FXML变量。这些变量被传递给第三类。单击任意位置时滑块会在何处更改。
问题是,当我传递第三类中的滑块的变量时,它们被完美地存储了,但是当您运行代码以修改单击时经过主类的滑块时,FXML变量为null。
这里有代码:
主班:
public class OpenPilot extends Application {
Movements Movements = new Movements();
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent Key) {
Movements.GetKeys(Key);
}
});
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
控制器:
public class FXMLDocumentController implements Initializable {
Movements Movements = new Movements();
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
Movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
动作:
public class Movements {
//Define Data Variables
public double SpeedValue;
public double TurnsValue;
//Define GUI Variables
private Slider SpeedSlider;
private Slider TurnsSlider;
public void GetSliders(Slider SpeedSlider, Slider TurnsSlider) {
this.SpeedSlider = SpeedSlider;
this.TurnsSlider = TurnsSlider;
}
//Get Sliders
public void GetKeys(KeyEvent Key) {
System.out.println(Key.getCode());
System.out.println(SpeedSlider);
Platform.runLater(new Runnable() {
@Override public void run() {
TurnsSlider.setValue(10);
}
});
}
}
最佳答案
您使用Movements
类的2个不同实例(Movements Movements = new Movements();
和OpenPilot
中的FXMLDocumentController
)。由于您不使用静态字段/方法,因此不会从一个实例到另一个实例获取任何数据。您必须从控制器获取Movements
对象:
控制器:
public class FXMLDocumentController implements Initializable {
Movements movements = new Movements();
public Movements getMovements() {
return movements;
}
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
使用
FXMLLoader
的实例而不是静态方法来从控制器获取Movements字段:主班:
public class OpenPilot extends Application {
Movements movements;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader();
// use non-static load method here
Parent root = fxmlLoader.load(getClass().getResource("FXMLDocument.fxml").openStream());
// get movements from via controller
FXMLDocumentController controller = fxmlLoader.<FXMLDocumentController>getController();
movements = controller.getMovements();
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent Key) {
movements.GetKeys(Key);
}
});
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
关于java - 空FXML变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23171753/