2017-08-01 42 views
0

我正在使用ControlsFX(v8.40.12)的SpreadsheetView控件进行一些测试,我不能将任何其他类型的对象添加到单元格中文本。无法在SpreadsheetView单元格中放入DatePicker或Button,甚至是图像

有没有代码的问题,或者我只是错过了一些东西? 有人能告诉我我该怎么做?

我正在使用SpreadsheetCellBase,SetGraphic和setCellValue。

有些评论在葡萄牙语,对不起!

非常感谢。

package javafx_controlsfx_spreadsheetview; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.DatePicker; 
import javafx.scene.control.Alert; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.stage.Stage; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import java.util.Arrays; 
import java.util.List; 
import org.controlsfx.control.spreadsheet.GridBase; 
import org.controlsfx.control.spreadsheet.Picker; 
import org.controlsfx.control.spreadsheet.SpreadsheetCell; 
import org.controlsfx.control.spreadsheet.SpreadsheetCellBase; 
import org.controlsfx.control.spreadsheet.SpreadsheetView; 

public class JavaFX_ControlsFX_SpreadsheetView extends Application 
{ 
    @Override 
    public void start(Stage primaryStage) 
    { 
    int numLinhas = 25; 
    int numColunas = 20; 
    GridBase grelha = new GridBase(numLinhas, numColunas); 
    ObservableList<ObservableList<SpreadsheetCell>> linhas = FXCollections.<ObservableList<SpreadsheetCell>>observableArrayList(); 
    ObservableList<SpreadsheetCell> celulas = null; 
    SpreadsheetCellBase celula; 

    for (int linha = 0; linha < grelha.getRowCount(); linha++) 
    { 
     celulas = FXCollections.<SpreadsheetCell>observableArrayList(); 
     for (int coluna = 0; coluna < grelha.getColumnCount(); coluna++) 
     { 
     celula = new SpreadsheetCellBase(linha, coluna, 1, 1); 
     celula.setItem("---"); 
     celulas.add(celula); 
     } 
     linhas.add(celulas); 
    } 
    grelha.setRows(linhas); 

    SpreadsheetView sv = new SpreadsheetView(grelha); 

    // Atribui um valor à (6ª Linha -> 6)/8ª Coluna -> H). 
    grelha.setCellValue(5, 7, "Pedro"); 

    // Atribui um valor à (5ª Linha -> 5)/13ª Coluna -> M). 
    grelha.setCellValue(4, 12, 164.58); 

    // Popula a Grelha de A1 a A6, com os países definidos na Lista abaixo criada. 
    List<String> countries = Arrays.asList("China", "França", "Nova Zelândia", "Escócia", "Alemanha", "Canada"); 
    byte r = 0; 
    for (String c : countries) 
    { 
     grelha.setCellValue(r, 0, c); 
     r++; 
    } 




    // Part of the code that doesn't work! 

    celula = new SpreadsheetCellBase(3, 7, 1, 1); 
    celula.setGraphic(new Button("Teste")); 
    grelha.setCellValue(3, 7, celula); 


    SpreadsheetCellBase cell = new SpreadsheetCellBase(10, 4, 1, 1); 
    cell.setGraphic(new DatePicker()); 


    SpreadsheetCellBase cell2 = new SpreadsheetCellBase(5, 9, 1, 1); 
    cell2.setGraphic(new ImageView(new Image(getClass().getResourceAsStream("pic.png")))); 

    // ------------------------------------- 




    sv.getStylesheets().add(getClass().getResource("Styles.css").toExternalForm()); 

    Scene scene = new Scene(sv, 1300, 800); 

    primaryStage.setTitle("JavaFX - ControlsFX (SpreadsheetView)"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 


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

有一个类似的帖子,但它并没有给我一个答案在这个问题上: How to change text in cells (SpreadsheetView by ControlsFX)?

回答

1

首先,你的代码是不是因为编译我们缺少的图片和CSS样式表。当你链接一个代码时,尽量让它直接工作。

关于您的问题,您正在创建新的SpreadsheetCells,但您绝不会将它们添加到网格中!

SpreadsheetCellBase cell = new SpreadsheetCellBase(10, 4, 1, 1); 
cell.setItem(null); 
cell.setGraphic(new DatePicker()); 

这是绝对正确的,除非单元格从未被赋予网格。您正在寻找的单元格已经添加到上面的循环中。因此,所有你需要做的是访问它,并设置日期选择器这样的:

linhas.get(10).get(4).setGraphic(new DatePicker()); 

然后它会奏效。

在一个侧面说明,它是更好地与SpreadsheetCellType和SpreadsheetCell工作的直接实例化SpreadsheetCellBase代替:

for (int linha = 0; linha < grelha.getRowCount(); linha++) 
    { 
     celulas = FXCollections.<SpreadsheetCell>observableArrayList(); 
     for (int coluna = 0; coluna < grelha.getColumnCount(); coluna++) 
     { 
     celula = SpreadsheetCellType.STRING.createCell(linha, coluna, 1, 1, "---"); 
//  celula.setItem("---"); 
     celulas.add(celula); 
     } 
     linhas.add(celulas); 
    } 

还要注意的是,我们有一个ControlsFX谷歌群里你可以问你的问题:https://groups.google.com/forum/#!forum/controlsfx-dev 我们在那里得到通知..所以通常反应速度更快;)

相关问题