JavaFX TableView问题添加行+组织多控制器和FXML应用程序

时间:2016-08-12 20:00:56

标签: java debugging javafx formatting gridpane

我是JavaFX的新手,我已经在这段代码中工作了大约8个小时,而且我对代码有点妄想。我的两个主要问题是:

  • 无法使用我的popUp框display()将新项添加到TableView。
  • 感觉凌乱无序。有关FXML和控制器之间更好的通信的任何提示? (再一次,我是新人,所以我可能已经盯着太久了)

我的主要课程

public class Main extends Application {
    public static Stage primaryStage;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage window) throws Exception {
        try {
            primaryStage = new Stage();
            window = primaryStage;

            Parent root = FXMLLoader.load(getClass().getResource("Fissto.fxml"));
            Scene scene = new Scene(root);
            window.setTitle("Fissto - the File Storage App!");
            window.setScene(scene);
            window.show();
        }catch(Exception e){
            e.printStackTrace();
        }
        //        C.setLibraryStage();
    }

}

我的主要Controller类(我有两个在Fissto.fxml中连接的子类)

public class Controller implements Initializable{
    Main main;

    @FXML LibraryController libraryController = new LibraryController();
    @FXML MergePageController mergePageController = new MergePageController();
    private AddImageController addImageController = new AddImageController();

    @FXML public void initialize(URL location, ResourceBundle resources){
        System.out.println("View is now loaded!");
        main = new Main();

        libraryController.init(this);
        mergePageController.init(this);
        addImageController.init(this);
    }

    //Interface Initialization
    public void setMergeStage() throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Controllers/MergePage.fxml"));
        Scene scene = new Scene(root);
        main.primaryStage.setScene(scene);
    }

    public void setLibraryStage() throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Controllers/LibraryPage.fxml"));
        Scene scene = new Scene(root);
        main.primaryStage.setScene(scene);
    }

    //Closing a window
    public void closeWindow(){
        main.primaryStage.close();
    }

}

最后是包含TableView的页面的控制器

public class LibraryController {

    private Controller main;

    //Library TableView Controllers
    @FXML public TableView<Image> library;
    @FXML private TableColumn<Image, String> NameColumn  = new TableColumn<>();
    @FXML private TableColumn<Image, ArrayList<String>> TagsColumn  = new TableColumn<>();
    @FXML private TableColumn<Image, String> CommentsColumn  = new TableColumn<>();
    @FXML private TableColumn<Image, String> FileLocationColumn  = new TableColumn<>();
    @FXML private TableColumn<Image, Integer> PointsColumn = new TableColumn<>();

    public void init(Controller main){
        System.out.println("LibraryPage Loading");
        this.main = main;

        addDataToColumns();
        library  = new TableView<>();
        library.getItems().setAll(getImages());
        System.out.println("LibraryPage Loaded");
    }

    //Initializes the column titles
    private void addDataToColumns(){
        NameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        TagsColumn.setCellValueFactory(new PropertyValueFactory<>("tags")); //TODO Convert to String format
        CommentsColumn.setCellValueFactory(new PropertyValueFactory<>("comments"));
        FileLocationColumn.setCellValueFactory(new PropertyValueFactory<>("filelocation"));
        PointsColumn.setCellValueFactory(new PropertyValueFactory<>("points"));
    }

     //Gets all of the images
     private ObservableList<Image> getImages() {
         //TODO: Add where to actually get the data from

         ObservableList<Image> images = FXCollections.observableArrayList();
         String s = "Dog, Cat, Jumping Jack,";
         ArrayList<String> list = Image.getTagOrganizer(',', s);
         images.add(new Image("Test", list, "Comment", "No File Location, yet!", 10));

         String k = "Calculus, Complex Numbers, Hard dude,";
         ArrayList<String> list2 = Image.getTagOrganizer(',', k);
         images.add(new Image("Number2", list2, "I love MathClub", "No File Location, yet!", -10));

         return images;
     }

最后一个类是弹出菜单,它接受输入以放入GridPane

public class AddImageController {

    private Controller main;

    public void init(Controller main){
        System.out.println("ImagePage Loaded");

        this.main = main;
    }

    //Submitting an image to the library from the AddImagePage
    public TextField nameInput;
    public TextField tagsInput;
    public TextField commentInput;
    public TextField pointsInput;
    public Label errorMessage;

    /** TODO: Make it so that it writes to file then theoretically, the main controller should read from file every so often
     * Main functionality for adding the information from the form to the database */
    public void submitImage(){
        if(!(nameInput.getText().trim().isEmpty()) && !(tagsInput.getText().trim().isEmpty()) && !(pointsInput.getText().trim().isEmpty())) {
            if (isInt(pointsInput)) {
//              System.out.print("Sent to database, *whoosh!*");
                LibraryController c = new LibraryController();

                ArrayList<String> s = Image.getTagOrganizer(',', tagsInput.getText());
                Image image = new Image(nameInput.getText(), s, commentInput.getText(),"Location Needed", Integer.parseInt(pointsInput.getText()));
                c.library.getItems().add(image);

                clearInputs();
            }
        }else {
            errorMessage.setText("Fill every field");
        }
    }

    //Clears the input fields in the AddImagePage
    public void clearInputs(){
        nameInput.clear();
        tagsInput.clear();
        commentInput.clear();
        pointsInput.clear();
        errorMessage.setText("");
    }


    //Submission format verifiers
    private boolean isInt(TextField input){
        try{
            int i = Integer.parseInt(input.getText());
            errorMessage.setText("");
            return true;
        }catch (NumberFormatException e){
            System.out.println("Oh no: " + input.getText() + " is not an integer");
            errorMessage.setText("Points must be a number");
            return false;
        }
    }

    //Image Selection Handler
    public void imageSelectionHandler(){

    }
}

我知道这可能很难阅读,因此非常感谢任何有关如何让以后更容易阅读的反馈。

0 个答案:

没有答案