2017-08-01 2 views
0

Ich habe einige Tests mit dem SpreadsheetView-Steuerelement von ControlsFX (v8.40.12) durchgeführt und kann außer einer anderen Zelle keinen anderen Objekttyp hinzufügen Text.Ein DatePicker oder eine Schaltfläche oder ein Bild kann nicht in SpreadsheetView-Zellen eingefügt werden

Gibt es ein Problem mit dem Code oder ich vermisse nur etwas? Kann mir jemand sagen, wie kann ich das tun?

Ich verwende SpreadsheetCellBase, SetGraphic und SetCellValue dafür.

Einige Kommentare sind in Portugiesisch, sorry!

Vielen Dank.

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

Es gibt eine ähnliche Position, aber es gibt mir keine Antwort auf diese Frage: How to change text in cells (SpreadsheetView by ControlsFX)?

Antwort

1

Zu allererst Ihr Code kompiliert nicht, weil wir das Bild und die CSS sind vermisst Stylesheet. Wenn Sie einen Code verknüpfen, versuchen Sie, ihn direkt zu verwenden.

In Bezug auf Ihr Problem erstellen Sie neue SpreadsheetCells, aber Sie fügen sie nie dem Grid hinzu!

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

Dies ist absolut korrekt, es sei denn, die Zelle wird nie an das Netz gegeben. Die Zelle, nach der Sie suchen, wurde bereits oben in der Schleife hinzugefügt. Also alles, was Sie tun müssen, ist es für den Zugriff auf und stellen Sie die Datepicker wie folgt aus:

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

Dann wird es funktionieren.

Auf einer Seite beachten, ist es besser, mit dem SpreadsheetCellType und das SpreadsheetCell zu arbeiten, anstatt direkt Instanziieren den 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); 
    } 

Beachten Sie auch, dass wir eine ControlsFX Google-Gruppe haben, wo Sie Ihre Fragen stellen können: https://groups.google.com/forum/#!forum/controlsfx-dev Wir werden dort benachrichtigt .. Also normalerweise kommt die Antwort schneller;)

Verwandte Themen