0

I was making some tests with the SpreadsheetView control from ControlsFX (v8.40.12) and i can't add any other type of object to a cell except text.

Is there some problem with the code or i'm just missing something? Can someone tell me how can i do that?

I'm using SpreadsheetCellBase, SetGraphic and setCellValue for that.

Some comments are in portuguese, sorry!

Many thanks.

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);
  }
}

There is a similar post, but it does not give me an answer on this matter: How to change text in cells (SpreadsheetView by ControlsFX)?

Pedro Figueiredo
  • 457
  • 5
  • 13

1 Answers1

2

First of all, your code is not compiling because we're missing the picture and the css stylesheet. When you link a code, try to make it work directly.

Regarding your issue, you are creating new SpreadsheetCells but you never add them to the Grid!

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

This is absolutely correct unless the cell is never given to the grid. The cell you are looking for has already been added in your loop above. So all you need to do is to access it, and set the datePicker like that :

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

Then it will work.

On a side note, it's better to work with the SpreadsheetCellType and the SpreadsheetCell instead of directly instantiating the 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);
    }

Also note that we have a ControlsFX google group where you can ask your questions: https://groups.google.com/forum/#!forum/controlsfx-dev We get notified there.. So usually the response comes quicker ;)

Maxoudela
  • 2,091
  • 3
  • 15
  • 23