如何获取JavaFX控制器的实例
我被代码卡住了。 我正在编写一个库系统,其中包含许多控制器。 这是我的主控制器fxml文件:如何获取JavaFX控制器的实例,javafx,textfield,Javafx,Textfield,我被代码卡住了。 我正在编写一个库系统,其中包含许多控制器。 这是我的主控制器fxml文件: <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Menu?> <?import javafx.scene.control.MenuBar?> <?import javafx.scene.control.MenuItem?> <?import javafx.sc
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<Pane prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.library.controllers.MainController">
<children>
<VBox>
<children>
<MenuBar>
<menus>
<Menu mnemonicParsing="false" text="Plik">
<items>
<MenuItem fx:id="Users" mnemonicParsing="false" onAction="#onUsersMenuAction" text="Użytkownicy" />
<MenuItem fx:id="Backup" mnemonicParsing="false" onAction="#onBackupMenuAction" text="Wykonaj kopię zapasową" />
<MenuItem fx:id="CloseProgram" mnemonicParsing="false" onAction="#onCloseProgramMenuAction" text="Zakończ" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Raporty">
<items>
<MenuItem fx:id="ActiveRentedBooks" mnemonicParsing="false" onAction="#onActiveRentedBooksMenuAction" text="Aktywne wypożyczenia" />
<MenuItem fx:id="ActiveBorrowers" mnemonicParsing="false" onAction="#onActiveBorrowersMenuAction" text="Aktualni dłużnicy" />
<MenuItem fx:id="ReportOfRentedBooksPerDay" mnemonicParsing="false" onAction="#onReportOfRentedBooksPerDayMenuAction" text="Raport wypożyczeń/dzień" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Słowniki">
<items>
<MenuItem fx:id="Categories" mnemonicParsing="false" onAction="#onCategoriesMenuAction" text="Kategorie" />
<MenuItem fx:id="UKDDictionary" mnemonicParsing="false" onAction="#onUKDDictionaryMenuAction" text="Słownik UKD" />
<MenuItem fx:id="ReasonsForDefects" mnemonicParsing="false" onAction="#onReasonForDefectsMenuAction" text="Powody ubytków" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Wydruki">
<items>
<MenuItem fx:id="PrintBookLabel" mnemonicParsing="false" onAction="#onPrintBookLabelActionButton" text="Drukuj etykietę książki" />
<MenuItem fx:id="PrintCardOfLoans" mnemonicParsing="false" onAction="#onPrintCardOfLoansMenuAction" text="Drukuj kartę wypożyczająćego" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Ustawienia">
<items>
<MenuItem fx:id="GeneralOptions" mnemonicParsing="false" onAction="#onGeneralOptionsMenuAction" text="Ogólne" />
</items>
</Menu>
</menus>
</MenuBar>
<TabPane prefHeight="547.0" prefWidth="800.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab fx:id="KBooks" text="Książki">
<fx:include source="Book.fxml" />
</Tab>
<Tab fx:id="CReaders" text="Czytelnicy">
<fx:include source="Readers.fxml" />
</Tab>
<Tab fx:id="WLoans" text="Wypożyczenia">
<fx:include source="Borrows.fxml" />
</Tab>
<Tab fx:id="ZReturns" text="Zwroty" >
<fx:include source="Return.fxml" />
</Tab>
<Tab fx:id="Communication" text="Komunikaty" >
<fx:include source="Comunication.fxml" />
</Tab>
</tabs>
</TabPane>
</children>
</VBox>
</children>
</Pane>
我有一个好消息,数据发送成功。并且WSurname.getText()方法返回良好的信息。
但在我看来,WSurname文本字段仍然是空的。
我想,当我在ReadersController中调用getController方法时,我会得到另一个控制器实例。
如何将数据设置为文本字段正确?您的
借用控制器的实例错误:在onCRentActionButton()
中,再次加载借用.fxml,获取UI的新副本,然后获取与该新副本关联的控制器。由于该UI的新副本从未显示,因此您正在更新一些看不到的内容
相反,将不同选项卡的控制器插入主控制器。根据,您可以使用附加了“controller”
的
的fx:id
注入控制器
因此,在主控制器中添加:
@FXML
private BorrowController borrowController ;
@FXML
private ReaderController readerController ;
将fx:id
s添加到
s:
要链接控制器,您需要在ReaderController
中引用brookcontroller
:
public class ReaderController {
private BorrowController borrowController ;
public void setBorrowController(BorrowController borrowController) {
this.borrowController = borrowController ;
}
// ...
}
您需要在主控制器的initialize()
方法中设置:
public class MainController {
@FXML
private BorrowController borrowController ;
@FXML
private ReaderController readerController ;
// ...
public void initialize() {
readerController.setBorrowController(borrowController);
// ...
}
// ...
}
最后你就可以做了
@FXML
void onCRentActionButton(ActionEvent event) throws IOException {
if(CTable.getSelectionModel().getSelectedItem()==null) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Błąd !!!");
alert.setHeaderText("Nie możesz edytować użytkownika, jeśli żadnego"
+ "nie zaznaczyłeś w tabeli!!");
alert.showAndWait();
} else {
ReaderBorrow rb;
int id=CTable.getSelectionModel().getSelectedItem().getId();
rb = SQLController.getInstance().getReaderToBorrow(id);
borrowController.setReader(rb);
}
}
如果使用a并将状态保留在模型类中,可以避免这些控制器之间的所有耦合。好的,现在我的主控制器中有nullPointerException.initialize()@Marcin,那么什么是null?哦,天哪,对不起,我没有在fxml文件中添加fx:id。现在可以用了,谢谢!但是你能解释一下fx:id是如何工作的吗?这让它们只在注射时可见?@Marcin是的,它就是这样做的。注入“嵌套控制器”有一个特殊约定;请参阅我在答案中链接的文档。
public class MainController {
@FXML
private BorrowController borrowController ;
@FXML
private ReaderController readerController ;
// ...
public void initialize() {
readerController.setBorrowController(borrowController);
// ...
}
// ...
}
@FXML
void onCRentActionButton(ActionEvent event) throws IOException {
if(CTable.getSelectionModel().getSelectedItem()==null) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Błąd !!!");
alert.setHeaderText("Nie możesz edytować użytkownika, jeśli żadnego"
+ "nie zaznaczyłeś w tabeli!!");
alert.showAndWait();
} else {
ReaderBorrow rb;
int id=CTable.getSelectionModel().getSelectedItem().getId();
rb = SQLController.getInstance().getReaderToBorrow(id);
borrowController.setReader(rb);
}
}