2017-03-02 86 views
0

我是Java和Java FX和場景生成器的新手。我把一個TabPane放到一個BorderPane中,現在我試圖填充TableView中的值,並將其放入到TabPane中。我有2個類,Player類和PlayerList類。只會填充物品從某處後,像這樣:如何填充TableView單元格 - 使用場景生成器

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集。現在我有一套,但我根本不知道該怎麼做。

月Player類看起來是這樣的:

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

不太確定,如果你問是在哪裏把調用'setCellValueFactory(...)'或如果你問別的...? –

回答

0

您需要更改該場景生成器提供爲表列的類型(它沒有辦法確定表的類型和列):

@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") 
     ); 
    } 
} 
+0

我只是插入?還是以某種方式使用SceneBuilder進行設置? –

+0

而且,我想知道程序如何知道,在nickColumn.setCellValueFactory中使用了什麼(新的PropertyVluaeFactory (「nick」));作爲im使用PlayerList playerList;數據現在存儲在哪裏? –

+0

我不知道反射。或者我必須把這個:private void getPlayersFromServer(){ this.playerList = FXCollections.observableArrayList( new player(「freakyy85」,「Owner」), new Player(「Ky3ak」,「Owner」) ) ; //在PlayerList.class中的其他代碼之上?因爲現在它沒有工作.-表沒有填充。我修正了上面的代碼,但它編譯。 –