我是Java和Java FX以及Scene Builder的新手。我将一个TabPane放入BorderPane,现在我正在尝试使用值填充我放入TabPane的TableView。我有2个类,Player类和PlayerList类。只会稍后从某个地方填充项目,如下所示:
public class PlayerList {
ObservableList<Player> playerList;
public PlayerList() {
getPlayersFromServer();
}
private getPlayersFromServer() {
this.playerList = FXCollections.observableArrayList(
new Player("freakyy85","Owner");
new Player("Ky3ak","Owner");
);
}
}
现在,如何使用以下内容填充TableView行:
nickColumn.setCellValueFactory(
new PropertyValueFactory<Player,String>("nick")
);
groupColumn.setCellValueFactory(
new PropertyValueFactory<Player,String>("group")
);
我首先想知道如何使用场景构建器做到这一点以及在哪里做,因为我没有设置fx:id。现在我有一套,但我根本不知道该怎么做。
May Player Class看起来像这样:
public class Player {
private SimpleStringProperty nick;
private SimpleStringProperty group;
public Player (String nick, String group) {
this.nick = new SimpleStringProperty(nick);
this.group = new SimpleStringProperty(group);
}
public String getNick () {
return nick.get();
}
public String getGroup () {
return group.get();
}
public void setNick (String nick) {
this.nick.set(nick);
}
public void setGroup (String group) {
this.group.set(group);
}
}
FXMLDocumentController.java:
package uctool;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.input.InputMethodEvent;
public class FXMLDocumentController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private TableColumn<?, ?> nickColumn;
@FXML
private TableColumn<?, ?> groupColumn;
@FXML
void handleTextChanged(InputMethodEvent event) {
}
@FXML
void initialize() {
assert nickColumn != null : "fx:id=\"nickColumn\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert groupColumn != null : "fx:id=\"groupColumn\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
}
}
FXMLDocument.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@../../resources/UCTool.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="uctool.FXMLDocumentController">
<center>
<TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER">
<tabs>
<Tab closable="false" text="Players">
<content>
<TableView editable="true" onInputMethodTextChanged="#handleTextChanged" prefHeight="200.0" prefWidth="200.0">
<columns>
<TableColumn fx:id="nickColumn" prefWidth="75.0" text="Nickname" />
<TableColumn fx:id="groupColumn" prefWidth="75.0" text="Group" />
</columns>
<padding>
<Insets bottom="3.0" left="5.0" right="5.0" top="3.0" />
</padding>
</TableView>
</content>
</Tab>
<Tab closable="false" text="Untitled Tab 2" />
</tabs>
</TabPane>
</center>
</BorderPane>
答案 0 :(得分:0)
您需要更改Scene Builder为表列提供的类型(无法确定表和列的类型):
@FXML
private TableColumn<Player, String> nickColumn;
@FXML
private TableColumn<Player, String> groupColumn;
然后,只需将调用发送到setCellValueFactory(...)
,就像拥有它们一样,使用initialize()
方法。所以你最终得到了
package uctool;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.input.InputMethodEvent;
public class FXMLDocumentController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private TableColumn<Player, String> nickColumn;
@FXML
private TableColumn<Player, String> groupColumn;
@FXML
void handleTextChanged(InputMethodEvent event) {
}
@FXML
void initialize() {
assert nickColumn != null : "fx:id=\"nickColumn\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert groupColumn != null : "fx:id=\"groupColumn\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
nickColumn.setCellValueFactory(
new PropertyValueFactory<Player,String>("nick")
);
groupColumn.setCellValueFactory(
new PropertyValueFactory<Player,String>("group")
);
}
}