2017-03-02 57 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中的其他代码之上?因为现在它没有工作.-表没有填充。我修正了上面的代码,但它编译。 –

相关问题