我一直在研究JavaFX,并试图弄清楚如何连接包中包含的类。我想要" text1btn"来自MainController类的按钮,用于从" scene1TextField"发送文本。也可以在MainController类中使用LeftTextArea类中的TextArea。我将不胜感激。谢谢。
打包示例;
public class Main extends Application {
public static BorderPane root = new BorderPane();
public static BorderPane getRoot() {
return root;
}
@Override
public void start(Stage primaryStage) throws Exception {
URL url1 = getClass().getResource("../view/MainView.fxml");
BorderPane bp1 = FXMLLoader.load(url1);
URL url2 = getClass().getResource("../view/LeftTextArea.fxml");
AnchorPane bp2 = FXMLLoader.load(url2);
root.setTop(bp1);
root.setCenter(bp2);
primaryStage.setScene(new Scene(root, 500, 400));
primaryStage.setResizable(false);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
包控制器;
public class MainController {
@FXML
Button scene1btn;
@FXML
Button scene2btn;
@FXML
TextField scene1TextField;
@FXML
TextField scene2TextField;
@FXML
Button text1btn;
@FXML
Button text2btn;
@FXML
TextArea mainViewTextArea;
@FXML
public void initialize() {
}
@FXML
public void text1btnClicked() {
}
@FXML
public void text2btnClicked() {
}
@FXML
private void scene1btnClicked() {
try {
URL url1 = getClass().getResource("../view/LeftTextArea.fxml");
AnchorPane bp1 = FXMLLoader.load(url1);
BorderPane border = Main.getRoot();
border.setCenter(bp1);
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
private void scene2btnClicked() {
try {
URL url2 = getClass().getResource("../view/RightTextArea.fxml");
AnchorPane bp2 = FXMLLoader.load(url2);
BorderPane border = Main.getRoot();
border.setCenter(bp2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
包控制器;
public class LeftTextArea {
@FXML
public TextArea leftTextArea;
}
答案 0 :(得分:1)
快速而简单的方法就是在StringProperty
中公开MainController
,当它发生变化时,请调用LeftTextArea
中的方法:
public class MainController {
private final StringProperty text = new SimpleStringProperty();
public StringProperty textProperty() {
return text ;
}
// existing code ...
@FXML
public void text1btnClicked() {
textProperty().set(scene1TextField.getText());
}
// ...
}
在LeftTextArea
做
public class LeftTextArea {
@FXML
public TextArea leftTextArea;
public void setText(String text) {
leftTextArea.setText(text);
}
}
然后你可以将它们与
结合在一起@Override
public void start(Stage primaryStage) throws Exception {
URL url1 = getClass().getResource("../view/MainView.fxml");
FXMLLoader loader1 = new FXMLLoader(url1);
BorderPane bp1 = loader1.load();
MainController mainController = loader1.getController();
URL url2 = getClass().getResource("../view/LeftTextArea.fxml");
FXMLLoader loader2 = new FXMLLoader(url2);
AnchorPane bp2 = loader2.load();
LeftTextArea leftTextArea = loader2.getController();
mainController.textProperty().addListener((obs, oldText, newText) ->
leftTextArea.setText(newText));
root.setTop(bp1);
root.setCenter(bp2);
primaryStage.setScene(new Scene(root, 500, 400));
primaryStage.setResizable(false);
primaryStage.show();
}
如果你最终需要这样的多个属性,这些属性基本上是在控制器之间共享的,你可能需要定义一个"模型"将它们全部封装在一个地方的类,并将模型传递给控制器。见,例如, JavaFX controller to controller - access to UI Controls或Applying MVC With JavaFx
答案 1 :(得分:-1)
如果你想在类LeftTextArea中设置任何字段,只需在类LeftTextArea中创建一个公共setter方法,如
public void setTextArea(Text text){
//do what you want to do
}
然后使用LeftTextArea类的对象从MainController类调用该方法。喜欢
LeftTextArea leftTextArea = new LeftTextArea();
leftTextArea.setTextArea(text); //text is the desired you want to send