代码之家  ›  专栏  ›  技术社区  ›  Pedro Figueiredo

无法在电子表格视图单元格中放置日期选择器、按钮甚至图像

  •  0
  • Pedro Figueiredo  · 技术社区  · 7 年前

    我使用ControlsFX(v8.40.12)中的SpreadsheetView控件进行了一些测试,除了文本之外,我无法向单元格添加任何其他类型的对象。

    我正在使用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 回复  |  直到 7 年前
        1
  •  2
  •   Maxoudela    7 年前

    首先,您的代码没有编译,因为我们缺少图片和css样式表。当你链接一个代码时,试着让它直接工作。

    关于您的问题,您正在创建新的电子表格单元格,但从未将其添加到网格中!

    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 我们在那里得到通知……所以通常反应更快;)