javafx tableview不显示内容

时间:2015-05-21 19:21:23

标签: java javafx

我最近开始使用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" />

感谢您的帮助。

0 个答案:

没有答案