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.
Hier nun ein Bild von meinem Programm, was nochmal verbildlicht, was genau ich meine:
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.
Java:
/**
* 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: