JavaFX 2 automatische kolombreedte

Ik heb een JavaFX 2-tabel die contactgegevens van mensen weergeeft, stel je voor dat er drie kolommen zijn: voornaam, achternaam en e-mailadres. Wanneer mijn applicatie start, wordt de tabel gevuld met verschillende rijen gegevens over de mensen die al in het systeem zitten.

Het probleem is dat de kolombreedten allemaal hetzelfde zijn. Meestal worden de voor- en achternaam volledig weergegeven, maar het e-mailadres wordt afgekapt. De gebruiker kan dubbelklikken op de scheidingslijn in de kop om het formaat van de kolom te wijzigen, maar dat wordt snel vervelend.

Als de tabel eenmaal is ingevuld, wil ik het formaat van alle kolommen programmatisch wijzigen om de gegevens weer te geven die ze bevatten, maar ik weet niet hoe ik dit kan bereiken. Ik zie dat ik col.setPrefWidth(x)kan aanroepen, maar dat helpt niet echt omdat ik de breedte zou moeten raden.


Antwoord 1, autoriteit 100%

Als uw totale aantal kolommen vooraf bekend is. U kunt de kolombreedten verdelen over de breedte van de tabelweergave:

nameCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4
surnameCol.prefWidthProperty().bind(personTable.widthProperty().divide(2)); // w * 1/2
emailCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4

In deze code worden de breedteverhoudingen van kolommen gesynchroniseerd wanneer de grootte van de tabelweergave wordt gewijzigd, dus u hoeft dit niet handmatig te doen. Ook neemt de surnameColde halve spatie van de breedte van de tabelweergave in beslag.


Antwoord 2, autoriteit 28%

Dit werkt voor mij in JavaFX 8

table.setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY );
col1.setMaxWidth( 1f * Integer.MAX_VALUE * 50 ); // 50% width
col2.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width
col3.setMaxWidth( 1f * Integer.MAX_VALUE * 20 ); // 20% width

In de andere voorbeelden heb je het probleem, de breedte van de verticale schuifbalk wordt genegeerd.


Antwoord 3, autoriteit 5%

Terwijl ik SceneBuider gebruik, definieer ik alleen de MinWidth en MaxWidth voor sommige kolommen en voor de hoofdkolom definieer ik gewoon de PrefWidth naar “USE_COMPUTED_SIZE”


Antwoord 4, autoriteit 4%

Na 3 jaar vond ik eindelijk de oplossing, javafx-kolom in tableview auto pasmaat

import com.sun.javafx.scene.control.skin.TableViewSkin;
import javafx.scene.control.Skin;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GUIUtils {
    private static Method columnToFitMethod;
    static {
        try {
            columnToFitMethod = TableViewSkin.class.getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class);
            columnToFitMethod.setAccessible(true);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    public static void autoFitTable(TableView tableView) {
        tableView.getItems().addListener(new ListChangeListener<Object>() {
            @Override
            public void onChanged(Change<?> c) {
                for (Object column : tableView.getColumns()) {
                    try {
                        columnToFitMethod.invoke(tableView.getSkin(), column, -1);
                    } catch (IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

Antwoord 5, autoriteit 4%

Als je 4 kolommen had en alleen de laatste kolom moest worden uitgevouwen om de rest van de tabelbreedte te vullen en de andere kolommen bleven de grootte die ik in Scene Builder had ingesteld.

double width = col1.widthProperty().get();
width += col2.widthProperty().get();
width += col3.widthProperty().get();
col4.prefWidthProperty().bind(table.widthProperty().subtract(width));

Of als u 2 kolommen had die toen moesten worden uitgebreid.

double width = col1.widthProperty().get();
width += col3.widthProperty().get();
col2.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2));
col4.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2));

Antwoord 6

Ook een heel eenvoudige truc op basis van een AnchorPaneis een goede oplossing.

We gaan de TableViewin een AnchorPaneplaatsen, maar we gaan ook de linker- en rechterkant van de TableViewals volgt verankeren:

p>

AnchorPane wrapper = new AnchorPane();
AnchorPane.setRightAnchor(table, 10.0);
AnchorPane.setLeftAnchor(table, 10.0);
wrapper.getChildren().add(table);

Deze eenvoudige code rekt de TableViewook in beide richtingen (rechts en links) uit en wordt aangepast wanneer de schuifbalk wordt toegevoegd.

Je kunt een idee krijgen van hoe dit werkt door deze geanimeerde gif te bekijken.

Nu kunt u het formaat van de kolommen wijzigen door deze regels toe te voegen:

fnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width
lnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 40 ); // 40% width
emColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width

Antwoord 7

Om de breedte te generaliseren en een willekeurig getal te gebruiken en ervoor te zorgen dat de breedte 100% van de breedte van de tabel is, kunt u het volgende gebruiken:

double[] widths = {20, 30, 50, 20, 30, 70, 50};//define the width of the columns
//calculate the sum of the width
double sum = 0;
for (double i : widths) {
    sum += i;
}
//set the width to the columns
for (int i = 0; i < widths.length; i++) {
    table.getColumns().get(i).prefWidthProperty().bind(
            table.widthProperty().multiply(sizes[i] / sum));
    //---------The exact width-------------^-------------^
}

Antwoord 8

mijn idee.

table.getColumns().add(new TableColumn<>("Num") {
    {
        // 15%
        prefWidthProperty().bind(table.widthProperty().multiply(0.15));
    }
});
table.getColumns().add(new TableColumn<>("Filename") {{
    // 20%
    prefWidthProperty().bind(table.widthProperty().multiply(.2));
}});
table.getColumns().add(new TableColumn<>("Path") {{
    // 50%
    prefWidthProperty().bind(table.widthProperty().multiply(.5));
}});
table.getColumns().add(new TableColumn<>("Status") {
    {
        // 15%
        prefWidthProperty().bind(table.widthProperty().multiply(.15));
    }
});

Other episodes