JavaFX-如何获得一个TableView来显示数组中的字符串?

JavaFX-如何获得一个TableView来显示数组中的字符串?,java,javafx,javafx-8,fxml,Java,Javafx,Javafx 8,Fxml,在尝试了许多不同的方法之后,我无法让这个TableView显示任何字符串。最初,数据应该来自ResultSet对象,但我无法完成这项工作。下面我的最新尝试似乎是显示数据的最直接的方式,但是字符串仍然不会显示 如您所见,TableView和ListView在FXML文档中进行了描述。ListView显示它的字符串没有任何问题。我错过什么了吗 public class AudioPlayerFXMLController implements Initializable { @FXML privat

在尝试了许多不同的方法之后,我无法让这个TableView显示任何字符串。最初,数据应该来自ResultSet对象,但我无法完成这项工作。下面我的最新尝试似乎是显示数据的最直接的方式,但是字符串仍然不会显示

如您所见,TableView和ListView在FXML文档中进行了描述。ListView显示它的字符串没有任何问题。我错过什么了吗

public class AudioPlayerFXMLController implements Initializable {

@FXML
private ListView playList;
@FXML
private TableView playListTableView;

@FXML
private TableColumn pathColumn, artistColumn, titleColumn, albumColumn,
        trackNumberColumn, lengthColumn, descriptionColumn,
        ratingColumn, dateColumn, settingColumn, URLColumn, languageColumn,
        nowPlayingColumn, publishedByColumn, encodedByColumn, artworkURLColumn,
        trackIDColumn;

private static final String NEW_PLAYLIST = "New Playlist";
private static final String FRIEND_PLAYLIST = "Friend's Playlist";
private static final String LIBRARY = "Library";
private static ButtonCell bc;
ObservableList<String> observablePlayList;
ObservableList<String> observableListForTableView;

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

    observablePlayList = FXCollections.observableArrayList();
    observablePlayList.add(NEW_PLAYLIST);
    observablePlayList.add(FRIEND_PLAYLIST);
    observablePlayList.add(LIBRARY);

    observableListForTableView = FXCollections.observableArrayList();
    observableListForTableView.add(NEW_PLAYLIST);
    observableListForTableView.add(FRIEND_PLAYLIST);
    observableListForTableView.add(LIBRARY);

    List<String> values = Arrays.asList("one", "two", "three", "three", "three",
            "three", "three", "three", "three",
            "three", "three", "three", "three", ""
            + "three", "three", "three", "three");

    System.out.println(FXCollections.observableArrayList(values));
    playListTableView.setItems(FXCollections.observableArrayList(values));
    playList.setItems(observablePlayList);

    playList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> list) {
            bc = new ButtonCell();
            return bc;
        }
    });

    playList.setEditable(true);
    playList.getSelectionModel().select(2);

    playList.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() {

        public void handle(ListView.EditEvent<String> event) {

            System.out.println(event.getEventType());
            System.out.println(event.getNewValue());
        }
    });

}

class ButtonCell extends ListCell<String> {

    private TextField fieldForEditingCell;

    @Override
    public void startEdit() {

        if (!isEditable() || !getListView().isEditable()) {
            return;
        }

        super.startEdit();

        if (isEditing()) {
            fieldForEditingCell = new TextField("Enter your edit here");
            fieldForEditingCell.setOnKeyPressed(new EventHandler<KeyEvent>() {

                public void handle(KeyEvent keyPress) {
                    if (keyPress.getCode() == KeyCode.ENTER) {
                        String nameOfnewPlayList = fieldForEditingCell.getText();
                        observablePlayList.add(nameOfnewPlayList);
                        playList.setItems(null);
                        playList.setItems(observablePlayList);
                        playList.getSelectionModel().select(nameOfnewPlayList);

                    } else if (keyPress.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });

            setGraphic(fieldForEditingCell);
            fieldForEditingCell.requestFocus();
            fieldForEditingCell.setEditable(true);

            fieldForEditingCell.focusedProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    if (!newValue && fieldForEditingCell != null) {
                        commitEdit(fieldForEditingCell.getText());
                    }
                }
            });

            fieldForEditingCell.selectAll();

        }
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();
        ImageView addSymbol;
        addSymbol = ImageViewBuilder.create().image(new Image("/images/ic_add_grey600_15dp.png")).build();
        addSymbol.fitHeightProperty();
        setText(getItem());
        setGraphic(addSymbol);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if ((this.getIndex() == 0) || (this.getIndex() == 1)) {
            ImageView addSymbol;
            addSymbol = ImageViewBuilder.create().image(new Image("/images/ic_add_grey600_15dp.png")).build();
            addSymbol.fitHeightProperty();
            setText(item);
            setGraphic(addSymbol);

            getStyleClass().add("custom_list-cell");
            //setStyle("-fx-background-color: #F5F5F5");
            //setStyle("-fx-hover-color: yellow");
        } else {
            setText(item);
            setGraphic(null);
        }
    }

}
//begin TableViewCell

class playListTableViewCellFactory extends TableCell<String, String> {

}

//begin tableView methods...
public void tableDraggedOVer(DragEvent event) {
    Dragboard db = event.getDragboard();
    if (db.hasFiles()) {
        event.acceptTransferModes(TransferMode.COPY);
    }
    event.consume();

}

public void dropCompleted(DragEvent event) {
    Dragboard db = event.getDragboard();
    boolean success = false;

    if (db.hasFiles()) {
        event.acceptTransferModes(TransferMode.COPY);
        DBUtils.addToPLaylistTableFromDragAndDrop(db.getFiles());
        success = true;
    }

    event.setDropCompleted(success);
    event.consume();
}

}

实际上,TableCell不显示任何内容—您必须实现updateItem才能实现它。顺便说一句:请学习java命名约定并坚持使用。课程以大写字母开头。再次感谢你,Kleopatra!此外,您似乎没有在任何表列上设置单元格值工厂;除非您在FXML中这样做,否则您还没有将表列添加到表中。在表视图中显示数据最直接的方法实际上是定义一个模型类,其实例表示表的每一行。这将使您的代码更容易。请至少通过示例13-6来查看,看看您是否可以从这里开始工作。这个人是这里的模范班。谢谢你,詹姆斯。该表用FXML描述。当我运行程序时,列标题正确显示。我只是在把数据输入牢房时遇到了麻烦。根据Kleopatra的建议,我有一个粗略的实现并正在运行。我目前正在查看教程。我不确定这个模型是否合适——我最终可能会有5000个表示文件的对象。我的表视图将从JavaDB结果集获取数据。关于这件事,你能给我一些建议吗?差不多了?与以任何其他方式存储数据相比,不会占用更多的资源。它一定会在记忆里。可能会增加每个对象几个字节的开销,这将是。。20-30KB?即使是真实数据;这种方法