2012-07-10 52 views
2

我使用javafx2控件TableView來顯示數據庫中的記錄(現在我有20條記錄)。 而當顯示記錄時,我想在每一行中添加按鈕。 所以我搜索了很多文章使用谷歌,並在下面寫一些代碼。updateItem的第二個參數在javafx2中永遠不會是false

關鍵代碼爲:

protected void updateItem(Long item, boolean empty) { 
    super.updateItem(item, empty); 
    if(empty) { 
     setText(null); 
     setGraphic(null); 
    } else { 
     final Button button = new Button("modifty"); 
     setGraphic(button); 
     setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
    } 
} 

我調試代碼,帕拉姆「空白」永遠不會「假」, 使按鍵絕不會在表格視圖中顯示,

誰能幫我?感謝

下面

是完整的代碼(Java和FXML):

的java:

package com.turbooo.restaurant.interfaces.javafx; 

import java.io.IOException; 
import java.net.URL; 
import java.text.SimpleDateFormat; 
import java.util.List; 
import java.util.ResourceBundle; 

import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ContentDisplay; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

import com.turbooo.restaurant.domain.Customer; 
import com.turbooo.restaurant.domain.CustomerRepository; 
import com.turbooo.restaurant.interfaces.facade.dto.CustomerDto; 
import com.turbooo.restaurant.interfaces.facade.dto.assembler.CustomerDtoAssembler; 
import com.turbooo.restaurant.util.ContextHolder; 
import com.turbooo.restaurant.util.UTF8Control; 

public class CustomerController implements Initializable { 

    @FXML 
    private TableView<CustomerDto> customerTableView; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 


     TableColumn<CustomerDto, Long> idCol = new TableColumn<CustomerDto, Long>("id"); 
     idCol.setCellValueFactory(
      new PropertyValueFactory<CustomerDto,Long>("id") 
     ); 

     TableColumn<CustomerDto, String> nameCol = new TableColumn<CustomerDto, String>("name"); 
     nameCol.setMinWidth(100); 
     nameCol.setCellValueFactory(
      new PropertyValueFactory<CustomerDto,String>("name") 
     ); 

     TableColumn<CustomerDto, String> birthdayCol = new TableColumn<CustomerDto, String>("birthday"); 
     birthdayCol.setCellValueFactory(
       new Callback<TableColumn.CellDataFeatures<CustomerDto, String>, ObservableValue<String>>() { 
        @Override 
        public ObservableValue<String> call(TableColumn.CellDataFeatures<CustomerDto, String> customer) { 
         if (customer.getValue() != null) { 
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
          return new SimpleStringProperty(sdf.format(customer.getValue().getBirthday())); 
         } else { 
          return new SimpleStringProperty(""); 
         } 
        } 
       }); 

     TableColumn<CustomerDto, Long> actionCol = new TableColumn<CustomerDto, Long>("action"); 
     actionCol.setCellFactory(
       new Callback<TableColumn<CustomerDto,Long>, TableCell<CustomerDto,Long>>() { 
        @Override 
        public TableCell<CustomerDto, Long> call(TableColumn<CustomerDto, Long> arg0) { 
         final TableCell<CustomerDto, Long> cell = new TableCell<CustomerDto, Long>() { 
          @Override 
          protected void updateItem(Long item, boolean empty) { 
           super.updateItem(item, empty); 
           if(empty) { 
            setText(null); 
            setGraphic(null); 
           } else { 
            final Button button = new Button("modifty"); 
            setGraphic(button); 
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
           } 
          } 
         }; 

         return cell; 
        } 
       }); 


     //TODO add button column 

     customerTableView.getColumns().addAll(idCol, nameCol, birthdayCol, actionCol);  

     loadData(); 

    } 

    public void loadData() { 
     CustomerRepository cusRepo = (CustomerRepository)ContextHolder.getContext().getBean("customerRepository"); 

     List<Customer> customers = cusRepo.findAll(); 
     CustomerDtoAssembler customerDTOAssembler = new CustomerDtoAssembler(); 
     List<CustomerDto> customerDtos = customerDTOAssembler.toDTOList(customers); 

     ObservableList<CustomerDto> data = FXCollections.observableArrayList(customerDtos); 
     customerTableView.setItems(data);   
    } 


    public void showNewDialog(ActionEvent event) { 
     ResourceBundle resourceBundle = ResourceBundle.getBundle(
       "com/turbooo/restaurant/interfaces/javafx/customer_holder", 
       new UTF8Control()); 

     Parent container = null; 
     try { 
      container = FXMLLoader.load(
        getClass().getResource("customer_holder.fxml"), 
        resourceBundle); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     container.setUserData(this); //pass the controller, so can access LoadData function in other place later 

     Scene scene = new Scene(container, 400, 300); 
     Stage stage = new Stage(); 
     stage.setScene(scene); 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.show(); 

    } 
} 

FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<BorderPane prefHeight="345.0" prefWidth="350.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.turbooo.restaurant.interfaces.javafx.CustomerController"> 
    <center> 
    <TableView fx:id="customerTableView" prefHeight="200.0" prefWidth="200.0" /> 
    </center> 
    <top> 
    <HBox alignment="CENTER_LEFT" prefHeight="42.0" prefWidth="350.0"> 
     <children> 
     <Button text="new" onAction="#showNewDialog"/> 
     <Separator prefHeight="25.0" prefWidth="13.0" visible="false" /> 
     <Button text="modify" /> 
     <Separator prefHeight="25.0" prefWidth="15.0" visible="false" /> 
     <Button text="delete" /> 
     </children> 
    </HBox> 
    </top> 
</BorderPane> 

回答

2

您沒有設置cellValueFactory爲您操作列,所以它總是空的。 一個簡單的方法是將單元格值設置爲記錄的ID。

actionCol.setCellValueFactory(
    new PropertyValueFactory<CustomerDto,Long>("id") 
); 

此外,我還創建與添加按鈕它,它需要的時候可以參考表中創建一個簡單的example

+0

謝謝。問題解決了 – 2012-07-11 14:23:13

相關問題