我最近开始使用JavaFx进行编程。我有以下问题: 我正在编写一个控制器类,其中我有一个带有命令的表,但内容只能在initialize方法中设置。
带订单的List应使用方法 setorderList 在orderTable中设置。问题是订单没有显示在TableView中 我已经尝试通过删除表的项目并再次填充它来触发TableView的更新。
出于测试目的,我在initialize()方法中使用测试顺序创建了orderList,并使用 orderTable.setItems(orderList)将它们设置为表。当我这样做时,效果很好。
因此,初始化方法(编号23)的顺序显示在表中,但 setOrderList 中设置的列表不是。
这让我很困惑,因为似乎 orderTable.setItems(orderList)语句只适用于initialize()方法。
这是我的代码:
public class OrderOverviewController implements Initializable{
@FXML
private TableView<Order> orderTable;
@FXML
private TableColumn<Order,Integer> orderNumberColumn;
private ObservableList<Order> orderList;
private OrderDao orderDao;
@Override
public void initialize(URL location, ResourceBundle resources) {
orderNumberColumn.setCellValueFactory(new PropertyValueFactory<>("orderId"));
orderList=FXCollections.observableArrayList();
//ordernumber and Current user
orderList.add(new Order(23,null));
orderTable.setItems(orderList);
}
public void setOrderList(ObservableList<Order> orderList) {
orderTable.setItems(orderList);
}
}
这是主类的启动方法,我为我的应用程序设置场景。首先加载LoginN.fxml,并且仅设置mainScene。之后,创建了LoginManager。
@Override
public void start(Stage primaryStage) throws IOException {
this.stage=primaryStage;
Parent root = FXMLLoader.load(getClass().getResource("/view /LoginN.fxml"));
loginScene=new Scene(root);
primaryStage.setScene(loginScene);
primaryStage.show();
root=null;
root = FXMLLoader.load(getClass().getResource("/view/Main.fxml"));
mainScene=new Scene(root);
new LoginManager(this);
}
所以这是我的LoginManager,它有自己的静态实例,所以我可以更容易地访问它。
方法 setLoggedInUser 在登录过程之后设置用户,如下一个包含方法登录的代码示例所示。
在这里,我获得了用户的所有订单,然后我称之为控制器的 setOrderMethod ,我的问题在于表格。
public class LoginManager {
private static LoginManager loginManager;
private Main main;
private User loggedInUser;
private OrderDao orderDao;
private MainController mainController;
private OrderOverviewController ooc;
public LoginManager(Main main){
loginManager=this;
this.main=main;
}
public static LoginManager getInstance(){
return loginManager;
}
public void setMainView(){
main.setMainView();
}
public void setLoggedInUser(User loggedInUser) {
this.loggedInUser = loggedInUser;
//load OrderViewController to set Previous orders
try {
URL location=getClass().getResource("/view/Orders.fxml");
FXMLLoader loader=new FXMLLoader();
loader.setLocation(location);
loader.setBuilderFactory(new JavaFXBuilderFactory());
Parent root=(Parent)loader.load(location.openStream());
orderDao=new OrderDao();
ooc=loader.getController();
ooc.setOrderList(orderDao.getOrdersOfUser(loggedInUser));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是LoginController的登录方法,当按下loginButton时会触发该方法:
public void login() throws Exception{
userName=usernameField.getText();
password=AESCrypt.encrypt(passwordField.getText());
if(userdao.isUserValid(userName, password))
{
LoginManager.getInstance().setMainView();
LoginManager.getInstance().setLoggedInUser(userdao.getUserByName(userName));
}
else
errorLabel.setText("Login failed!");
}
如果userData有效,则使用LoginManager设置mainScene并设置登录用户。
这是我在主视图的选项卡中包含Orders.fxml(OrderOverviewController的视图)的方式:
<fx:define>
<fx:include source="Orders.fxml" fx:id="orderOverviewContent"/>
</fx:define>
<Tab content="$orderOverviewContent" text="Order Overview" />
感谢您的帮助。