2013-10-03 116 views
3

有人可以在下面的代碼中提出問題。我無法填充表格中的數據。 這段代碼基本上應該添加一列(col1)並在其中添加一行數據d1。此代碼能夠添​​加列,但不能添加數據。javafx 2- tableview動態列

控制器 -

import java.util.ArrayList; 
import java.util.List; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 

public class FXMLTableViewController { 
    @FXML private TableView tableView; 

    @FXML 
    private void initialize() { 
     List<String> columns = new ArrayList<String>(); 
     columns.add("col1"); 
     TableColumn [] tableColumns = new TableColumn[columns.size()];  
     int columnIndex = 0; 
     for(String columName : columns) { 
      tableColumns[columnIndex++] = new TableColumn(columName); 
     } 
     tableView.getColumns().addAll(tableColumns); 
     ObservableList<ObservableList> csvData = FXCollections.observableArrayList(); 
     ObservableList<String> row = FXCollections.observableArrayList(); 
     row.addAll("d1"); 
     csvData.add(row); 
     tableView.getItems().add(csvData); 

    } 

    } 

FXML

<?import javafx.collections.*?> 
<?import javafx.geometry.Insets?> 
<?import java.lang.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.control.cell.*?> 
<?import javafx.scene.layout.*?> 
<?import fxmltableview.*?> 


<GridPane alignment="center" hgap="10.0" vgap="10.0" fx:controller="FXMLTableViewController" 
      xmlns:fx="http://javafx.com/fxml"> 
    <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="1"> 
      <columns> 
      </columns>  
    </TableView> 
</GridPane> 

主類 -

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class FXMLTableView extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     primaryStage.setTitle("FXML TableView Example"); 
     Pane myPane = (Pane)FXMLLoader.load(getClass().getResource("fxml_tableview.fxml")); 
     Scene myScene = new Scene(myPane); 
     primaryStage.setScene(myScene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

請參閱[Oracle的TableView教程](http://docs.oracle.com/javafx/2/ui_controls/table-view.htm)中的「示例12-12添加地圖數據到表格」。 –

+0

嗨Uluk,我正在尋找tableview代碼,其中列數不固定(即它可以在運行時更改,可以說,基於db查詢)。我有一個java對象,它是固定行(即5行但列數可變) – user2816100

回答

5

嘗試下面的代碼會顯示相同的,因爲你需要

List<String> columns = new ArrayList<String>(); 
    columns.add("col1"); 
    columns.add("col2"); 
    TableColumn [] tableColumns = new TableColumn[columns.size()];  
    int columnIndex = 0; 
    for(int i=0 ; i<columns.size(); i++) { 
     final int j = i; 
     TableColumn col = new TableColumn(columns.get(i)); 
     col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){     
      public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                        
       return new SimpleStringProperty(param.getValue().get(j).toString());      
      }     
     }); 
     tableview.getColumns().addAll(col); 
    }  
    ObservableList<String> row = FXCollections.observableArrayList(); 
    ObservableList<String> row1 = FXCollections.observableArrayList(); 
    row.addAll("d1"); 
    row.addAll("d11"); 
    row1.addAll("d2"); 
    row1.addAll("d22"); 
    tableview.getItems().add(row); 
    tableview.getItems().add(row1); 
+0

得到編譯錯誤對於類型TreeItem ,方法get(int)未定義。 – Cengiz

0

我敢肯定它會幫助你

public class DBClass 
{  
public Connection getConnection() throws ClassNotFoundException, SQLException 
{  
     Class.forName("com.mysql.jdbc.Driver"); 
     return DriverManager.getConnection("jdbc:mysql://192.168.0.1:3306 /dbname","mysqluser","mysqluserpwd"); 
} 
} 

在控制器類做到以下幾點:

@FXML 
void initialize() 
{ 
assert tableview != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'."; 
colUserName.setCellValueFactory(
    new PropertyValueFactory<Usermaster,String>("userName"));   
colPassword.setCellValueFactory(    
    new PropertyValueFactory<Usermaster,String>("userPassword")); 
colUserType.setCellValueFactory(
    new PropertyValueFactory<Usermaster,String>("userType"));   
colPhoto.setCellValueFactory(
    new PropertyValueFactory<Object,ImageView>("userPhoto")); 
objDbClass = new DBClass(); 
try 
{ 
    con = objDbClass.getConnection(); 
    buildData(); 
} 
catch(ClassNotFoundException ce) 
{ 
    logger.info(ce.toString()); 
} 
catch(SQLException ce) 
{ 
    logger.info(ce.toString()); 
} 
} 

private ObservableList<Usermaster> data; 

public void buildData() 
{   
data = FXCollections.observableArrayList(); 
try 
{  
    String SQL = "Select * from usermaster Order By UserName";    
    ResultSet rs = con.createStatement().executeQuery(SQL); 
    while(rs.next()) 
    { 
     Usermaster cm = new Usermaster(); 
     cm.userId.set(rs.getInt("UserId"));      
     Image img = new Image("tailoring/UserPhoto/User"+cm.getUserId().toString()+".jpg");     

     ImageView mv = new ImageView(); 
     mv.setImage(img); 
     mv.setFitWidth(70); 
     mv.setFitHeight(80); 
     cm.userPhoto.set(mv); 
     cm.userName.set(rs.getString("UserName")); 
     cm.userPassword.set(rs.getString("UserPassword")); 
     cm.userType.set(rs.getString("UserType")); 
     data.add(cm);     
    } 
    tableview.setItems(data); 
} 
catch(Exception e) 
{ 
     e.printStackTrace(); 
     System.out.println("Error on Building Data");    
} 
} 

,並創建一個POJO爲每個實體(表)一個單獨的Java文件要使用操縱TableView

public class Usermaster 
{  

public SimpleIntegerProperty userId = new SimpleIntegerProperty(); 
    public ObjectProperty userPhoto = new SimpleObjectProperty(); 
    public SimpleStringProperty userName = new SimpleStringProperty(); 
public SimpleStringProperty userPassword = new SimpleStringProperty(); 
    public SimpleStringProperty userType = new SimpleStringProperty(); 
    public SimpleStringProperty encPass = new SimpleStringProperty(); 
public SimpleStringProperty updt = new SimpleStringProperty(); 
    public SimpleStringProperty uptm = new SimpleStringProperty(); 

public Integer getUserId() { 
    return userId.get(); 
    } 

    public Object getUserPhoto() { 
    return userPhoto.get(); 
    } 

public String getUserName() { 
    return userName.get(); 
    } 

    public String getUserPassword() { 
    return userPassword.get(); 
    } 

    public String getUserType() { 
    return userType.get(); 
    } 

    public String getEncPass() { 
    return encPass.get(); 
    } 

    public String getUpdt() { 
    return updt.get(); 
} 

public String getUptm() 
{ 
    return uptm.get(); 
} 
} 

我測試過這個程序,它的工作完美。

+0

你在哪裏定義了colUserName? – serup

0

我也試圖在運行時

你做的很好使用ArrayList中爲列添加列。 你應該對tableColumns做同樣的事情,否則它仍然是固定的列數。

List<String> columns = new ArrayList<String>(); 
List<TableColumn> tableColumns = new ArrayList<TableColumn>; 

「D1」沒有出現的原因是因爲 ,而你已經正確連接的數據表中

tableView.getItems().add(csvData); 

你忘了的數據域鏈接到列,你應該添加

tableColumns[i].setCellValueFactory("sorry, I have no idea what to write here in your case");