# JavaFX TableColumn - TableColumn Breite



## Christopher25 (14. Mai 2016)

Hallo Zusammen.
Ich habe folgendes Problem.
Ich schreibe derzeit einen Datenbankexplorer. Dieser lädt alle Spalten aus der Datenbank und zeigt diese in einer JavaFX TableView an (per doppelklick) und lädt dann auch erst die Daten.
Mein Problem ist, dass die Columns sich nicht richtig anzeigen.
Weder sind diese zu Klein und mit einem ... weitergeführt, oder hängen irgendwo ganz rechts
außerhalb des sichtbaren Bereichs der Tabelle und es kommt einfach kein Scrollbalken.
Besonders, wenn die Tabelle keine Rows hat.

Das Ergebnis sollte wie folgt aussehen:
- Die TabellenColumns sollten mindestens die Größe des Textes und des Icons haben, welches die Spalte anzeigt.
- Wenn es Inhalt gibt, sollte die Spalte um 10pixel größer sein, als der größte Inhalt innerhalb der Tabelle.
- Wenn es keinen Inhalt gibt sollten alle Spalten mit dem vollen Text&Icons vollständig angezeigt werden.

Hier nun mein Code, welches die Komplette TableView erstellt und konfiguriert.

```
/**
     * Erstellt den Content für den Tab.
     * @param table = Tabelle die angezeigt werden soll.
     * @param showRowLimit = Zeigt bei true den Spinner für den Limit der Datensätze an und bei false nichts.
     * @return
     */
    private BorderPane createTableView(SQLTable table, boolean showRowLimit) {
        BorderPane border = new BorderPane();
       
        TableView tableView = new TableView();
        tableView.setEditable(true);
        tableView.getStylesheets().add(getClass().getResource("/tables.css").toExternalForm());
       
        BorderPane boxHead = new BorderPane();
        boxHead.setPadding(new Insets(5));
       
        HBox boxlabel = new HBox();
        Label labelTableName = new Label(StringHelper.createTableName(table.getCatalog(), table.getSchema(), table.getName()));
        labelTableName.setFont(new Font("LIBERAN SAN", 15));
        labelTableName.setTextFill(Color.web("yellow"));
        labelTableName.setEffect(new Glow());
        boxlabel.getChildren().add(labelTableName);
       
        Spinner spinnerLimit;
        if (showRowLimit) {
            Label labelSpinnerLimit = new Label("Datgensätze:");
            labelSpinnerLimit.setFont(new Font("LIBERAN SAN", 12));
            labelSpinnerLimit.setTextFill(Color.web("yellow"));
            HBox boxSpinner = new HBox();
            spinnerLimit = new Spinner();
            spinnerLimit.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(1, Integer.MAX_VALUE, 1000, 1));
            spinnerLimit.setEditable(true);
           
            Button buttonUpdateTable = new Button("", new ImageView(new Image(SourceHandler.getIcon("refresh.png"), 16, 16, true, true)));
            buttonUpdateTable.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    Spinner spinner = mapButtonToSpinner.get(event.getSource());
                   
                    int limit = 1000;
                    if (spinnerLimit != null) {
                        limit = (Integer) spinner.getValue();
                    }
                    reloadTable(tableView, table, limit);
                };
            });
            mapButtonToSpinner.put(buttonUpdateTable, spinnerLimit);
           
            boxSpinner.getChildren().add(labelSpinnerLimit);
            boxSpinner.getChildren().add(spinnerLimit);
            boxSpinner.getChildren().add(buttonUpdateTable);
           
            boxSpinner.setPadding(new Insets(5));
            boxSpinner.setSpacing(10);
            boxHead.setRight(boxSpinner);
            boxSpinner.setAlignment(Pos.CENTER_RIGHT);
        }
       
        boxHead.setStyle("-fx-background-color: #336699;");
        boxHead.setLeft(boxlabel);
        boxlabel.setAlignment(Pos.CENTER_LEFT);
       
        for (int i = 0; i < table.getColumnCount(); i++) {
            SQLTableColumn column = table.getColumns().get(i);
            TableColumn tableColumn = new TableColumn();
           
            Label labelColumn = new Label(column.getLabel());
            Tooltip tip = new Tooltip(column.getLabel() + " - " + column.getDatatype().toString() + "(" + column.getDatatype().getSize() + ")");
            labelColumn.setTooltip(tip);
           
            ImageView imageViewColumn = new ImageView(new Image(SourceHandler.getIcon(column.getIcon()), 16, 16, true, true));
            labelColumn.setGraphic(imageViewColumn);
           
            tableColumn.setGraphic(labelColumn);
            tableColumn.setResizable(true);
           
            SQLDataType value = column.getDatatype();
            if(value    == SQLDataType.BIGINT         || value == SQLDataType.BINARY         || value == SQLDataType.BIT
            || value     == SQLDataType.DECIMAL        || value == SQLDataType.TINYINT        || value == SQLDataType.IMAGE
            || value     == SQLDataType.DOUBLE         || value == SQLDataType.FLOAT         || value == SQLDataType.INT
            || value     == SQLDataType.INTEGER        || value == SQLDataType.LONG         || value == SQLDataType.MONEY
            || value     == SQLDataType.NUMERIC        || value == SQLDataType.REAL         || value == SQLDataType.IDENTITY
            || value     == SQLDataType.SMALLINT     || value == SQLDataType.SMALLMONEY     || value == SQLDataType.TIME
            || value     == SQLDataType.MEDIUMINT     || value == SQLDataType.BLOB         || value == SQLDataType.CLOB
            || value     == SQLDataType.CURSOR        || value == SQLDataType.ARRAY) {
                tableColumn.setStyle("-fx-alignment: CENTER-RIGHT;");
                labelColumn.setStyle("-fx-alignment: CENTER-RIGHT;");
            } else {
                tableColumn.setStyle("-fx-alignment: CENTER-LEFT;");
                labelColumn.setStyle("-fx-alignment: CENTER-LEFT;");
            }
           
            final int j = i;
            tableColumn.setCellValueFactory(new Callback<CellDataFeatures<SQLTableValue[], Object>,ObservableValue<Object>>(){                   
                public SimpleObjectProperty<Object> call(CellDataFeatures<SQLTableValue[], Object> param) {   
                    return new SimpleObjectProperty(param.getValue()[j].getValue());                       
                }
            });
           
            tableColumn.setOnEditCommit(new EventHandler<CellEditEvent>() {
                @Override
                public void handle(CellEditEvent event) {
                    SQLRow row = ((SQLRow) event.getTableView().getItems().get(event.getTablePosition().getRow()));
                    row.setValue(
                            event.getTablePosition().getColumn(),
                            new SQLTableValue(((SQLTableColumn)event.getOldValue()).getDatatype(), event.getNewValue()).setParent(row));
                }
            });
            tableView.getColumns().add(tableColumn);
        }
        ObservableList rows = FXCollections.observableArrayList();
       
        for (SQLRow row : table.getRows()) {
            rows.add(row.getValues());
        }
       
        tableView.setItems(rows);
        border.setTop(boxHead);
        border.setCenter(tableView);
        return border;
    }
```

Hier nun ein Bild von meinem Programm, was nochmal verbildlicht, was genau ich meine:


----------



## Christopher25 (15. Mai 2016)

Weiß keiner eine Lösung? Oder ist die zu einfach, und wollt mir die Peinlichkeit ersparen? ^^ XD


----------



## thet1983 (15. Mai 2016)

Ich weis die Methode jetzt nicht auswendig aber schau mal unter TableView in der API

Edit: 
setColumnResizePolicy


----------



## Christopher25 (15. Mai 2016)

Das hilft leider auch nicht wirklich weiter.
Es löst zwar das Problem, dass bei "keinem Content" die Columns groß gezogen werden.
Aber nicht das Problem, dass die Punkte bei den Columns kommen, wenn die Anzahl oder einfach
die "ColumnName" -Breiten über die Größe der Tabelle hinausgehen.
Die Sollen sich aber so groß machen wie oben beschrieben und einfach den Scrollbalken anzeigen,
dass man dann scrollen soll.


----------



## thet1983 (15. Mai 2016)

http://stackoverflow.com/questions/10152828/javafx-2-automatic-column-width

Schau da mal rein...vl hilft dir das


----------



## Christopher25 (15. Mai 2016)

Leider nein. Dort im Beitrag geht es ja leider nur um einen Prozentualen Anteil aller Spalten zueinander.
Jedoch nicht um die Tatsächlich benötigte Breite einzelner Spalten.


----------



## domjos1994 (16. Mai 2016)

Guten Morgen,

also in der Spaltenüberschrift ohne Inhalt könntest du zumindest die Breite des Textes wie folgt auslesen:

```
new Text(SpaltenText).getLayoutBounds().getWidth()
```
Dann noch die Breite des Bildes dazu und am besten noch bei jeder Spalte eine gewisse Breite darauf rechnen,
dann müsste zumindest dieses Problem gelöst sein.

LG Dominic


----------



## Christopher25 (16. Mai 2016)

Funktioniert leider nicht.
Wenn ich die komponente von einem Label in ein Text ändere, dann überlappen sich die Schriften über die Spalten.


----------



## Christopher25 (16. Mai 2016)

So es hat sich erledigt.
Irgendetwas habe ich geändert, was genau mein Ergebnis erzielt^^
Ich forsche gerade noch nach, was genau es ist.


----------

