无法在 SpreadsheetView 单元格中放置 DatePicker 或 Button 甚至图像
Can't put a DatePicker or a Button or even an Image in SpreadsheetView cells
我正在使用 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);
}
}
有一个类似的post,但它没有给我关于这个问题的答案:
首先,您的代码没有编译,因为我们缺少图片和 css 样式表。当你link一个代码时,试着让它直接工作。
关于您的问题,您正在创建新的 SpreadsheetCells,但您从未将它们添加到网格中!
SpreadsheetCellBase cell = new SpreadsheetCellBase(10, 4, 1, 1);
cell.setItem(null);
cell.setGraphic(new DatePicker());
这是绝对正确的,除非从未将单元格提供给网格。您要查找的单元格已添加到上面的循环中。所以你需要做的就是访问它,然后像这样设置 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 google 群组,您可以在其中提出问题:https://groups.google.com/forum/#!forum/controlsfx-dev
我们会在那里收到通知。所以通常回复会更快 ;)
我正在使用 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);
}
}
有一个类似的post,但它没有给我关于这个问题的答案:
首先,您的代码没有编译,因为我们缺少图片和 css 样式表。当你link一个代码时,试着让它直接工作。
关于您的问题,您正在创建新的 SpreadsheetCells,但您从未将它们添加到网格中!
SpreadsheetCellBase cell = new SpreadsheetCellBase(10, 4, 1, 1);
cell.setItem(null);
cell.setGraphic(new DatePicker());
这是绝对正确的,除非从未将单元格提供给网格。您要查找的单元格已添加到上面的循环中。所以你需要做的就是访问它,然后像这样设置 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 google 群组,您可以在其中提出问题:https://groups.google.com/forum/#!forum/controlsfx-dev 我们会在那里收到通知。所以通常回复会更快 ;)