Как добавить Связанный список объектов в TableView, используя javafx / scene builder? - PullRequest
0 голосов
/ 17 октября 2019

Я занимаюсь разработкой довольно простого приложения javafx, в котором есть несколько разных сцен. Моя первая сцена - добавить объект Show в общий связанный список, а затем во вторую сцену добавить исполнение одного из этих шоу к этому. объект (например, добавить утренник или вечернее представление к шоу Энни)

Я создал первую сцену и могу добавить Показать объекты в связанный список, но не могу заполнить табличное представление во второй сцене созданнымпоказывает пользователю, что нужно выбрать и добавить производительность

Вот так выглядит мой контроллер добавления шоу:

public class AddShowController {

    @FXML private TextField titleField;
    @FXML private TextField cirField,stlField, balField;
    @FXML private Slider runTimeSlider;
    @FXML private DatePicker startDatePicker, endDatePicker;
    TheLinkedList<Show> showList = new TheLinkedList<>();

    private static AddShowController instance;

    public AddShowController() {
        instance = this;
    }

    public static AddShowController getInstance(){
        return instance;
    }

    public void addShowButtonPushed (ActionEvent e){

        showList.addElement(new Show (titleField.getText(),
                                (int) runTimeSlider.getValue(),
                                startDatePicker.getValue().toString(),
                                endDatePicker.getValue().toString(),
                                cirField.getText(),
                                stlField.getText(),
                                balField.getText()));
}

Как вы можете видеть, я попытался создать экземпляр контроллера, поэтомуя мог получить доступ к связанному списку из контроллера производительности add, но не радостно.

Это контроллер производительности add:


public class AddPerfController {

    @FXML private ChoiceBox perfTimeChoiceBox;

    @FXML private TableView<Show> showTable;
    @FXML private TableColumn<Show, String> titleColumn;
    @FXML private TableColumn<Show, String> runTimeColumn;
    @FXML private TableColumn<Show, String> startDateColumn;
    @FXML private TableColumn<Show, String> endDateColumn;
    @FXML private TableColumn<Show, String> cirTicketPriceColumn;
    @FXML private TableColumn<Show, String> stlTicketPriceColumn;
    @FXML private TableColumn<Show, String> balTicketPriceColumn;

    private ObservableList<Show> showData = FXCollections.observableList(AddShowController.getInstance().showList);

    public void initialize() {
        perfTimeChoiceBox.getItems().addAll("Matinee","Evening");
        perfTimeChoiceBox.setValue("Matinee");

        titleColumn.setCellValueFactory(new PropertyValueFactory<>("title"));
        runTimeColumn.setCellValueFactory(new PropertyValueFactory<>("runningTime"));
        startDateColumn.setCellValueFactory(new PropertyValueFactory<>("startDate"));
        endDateColumn.setCellValueFactory(new PropertyValueFactory<>("endDate"));
        cirTicketPriceColumn.setCellValueFactory(new PropertyValueFactory<>("cirTicketPrice"));
        stlTicketPriceColumn.setCellValueFactory(new PropertyValueFactory<>("stlTicketPrice"));
        balTicketPriceColumn.setCellValueFactory(new PropertyValueFactory<>("balTicketPrice"));

        showData.add(new Show("Annie", 100,"12/12/2019", "14/12/2019","10","15", "20"));
        showTable.setItems(showData);

    }

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Это не лучшее решение, но оно решило мою проблему и просто захотело обновить этот вопрос.

Я переместил свой LinkedList в класс Main и сделал его общедоступным статическим для доступа к нему с обоих контроллеров

public static TheLinkedList<Show> showList = new TheLinkedList<>();

Чтобы использовать ObservableList, я преобразовал свой LinkedList в arrayList с помощью следующегометод в моем классе TheLinkedList

    public  Show[] getShowList(){
        Show[] newShows = new Show[counter];

        sample.Node temp = Main.showList.getHead();
        for(int i = 0; i<counter;i++ ){
            newShows[i] = (Show)temp.getData();
            temp = temp.getNext();
        }
        return newShows;
    }
    public void initialize() {
    showData = FXCollections.observableArrayList((Main.showList.getShowList()));
     (column data) .......
    showTable.setItems(showData);

}
0 голосов
/ 18 октября 2019

Мы не уверены, что это то, что вы пытаетесь сделать, но посмотрите, что логика
Мы используем контроллер представления модели, потому что наши данные находятся в базе данных
Так мы заполняем нашу таблицу с именем ctableне креатив

    private void ReadFromChild() throws SQLException{

ObservableList<ChildModel> TableData = FXCollections.observableArrayList();
    stmnt = conn.createStatement();

    ResultSet rs = stmnt.executeQuery("SELECT * FROM Child WHERE cMonth ='"+strMONTH+"'AND cYear ='"+strYEAR+"'" );//works);
    while (rs.next()){// Add data to observableArrayList TableData to select a table ROW

    TableData.add(new ChildModel(rs.getString("CID"),rs.getString("cDisplayDate"),rs.getString("cTitle")));
    displayDATE = rs.getString("cDisplayDate");
    }
    PropertyValueFactory<ChildModel, String> IDCellValueFactory = new PropertyValueFactory<>("CID");
    colID.setCellValueFactory(IDCellValueFactory);
    PropertyValueFactory<ChildModel, String> DateCellValueFactory = new PropertyValueFactory<>("cDisplayDate");
    colDD.setCellValueFactory(DateCellValueFactory);
    PropertyValueFactory<ChildModel, String> TypeCellValueFactory = new PropertyValueFactory<>("cTitle");
    colTitle.setCellValueFactory(TypeCellValueFactory);

    Collections.sort(TableData, (p2, p1)-> p1.getCID().compareToIgnoreCase(p2.getCID()));
    // Line of Code above Sorts Database Columns based on VARIABLE in ChildModel
    // Change p2,p1 to sort Ascending or Descending
    if(TableData.size() < 15) {// Format TableView to display Vertical ScrollBar
        ctable.setPrefWidth(746);// 19 is the off set
    }else {
        ctable.setPrefWidth(765);
    }   ctable.setItems(TableData);
    stmnt.close();  
}

ОК, когда мы нажимаем на строку в таблице, мы переходим к другому контроллеру, вот код для этого

    private void toDetailView() throws IOException{
    stage = (Stage)childTVPane.getScene().getWindow();// pane you are ON
    detailviewPane = FXMLLoader.load(getClass().getResource("detailview.fxml"));// pane you are GOING TO
    Scene scene = new Scene(detailviewPane);// pane you are GOING TO
    scene.getStylesheets().add(getClass().getResource("diary.css").toExternalForm());
    stage.setScene(scene);
    stage.setTitle("Diary Entry for "+displayDATE); 
    stage.show();
    stage.sizeToScene();
    stage.centerOnScreen(); 
}

private void showTableDataDetails(ChildModel info) throws IOException{
    if (info != null) {
       info =  (ChildModel) ctable.getSelectionModel().getSelectedItem();
       String str = info.getCID();
       strID = Integer.valueOf(str);
       toDetailView();
    }
}

@Override
public void initialize(URL url, ResourceBundle rb) {

    ctable.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends ChildModel>
        observable,ChildModel oldValue, ChildModel newValue) -> {
        try {
            showTableDataDetails((ChildModel) newValue); // When a row of the table is Selected call
            // Proper Construction                   // showTableDataDetails method
        } catch (IOException ex) {
            Logger.getLogger(ParentTableViewController.class.getName()).log(Level.SEVERE, null, ex);
        }
    });
}  
...