50

人々の連絡先の詳細を表示するJavaFX2テーブルがあります。名、姓、電子メールアドレスの3つの列があると想像してみてください。私のアプリケーションが起動すると、システムにすでに存在する人々に関するデータのいくつかの行がテーブルに入力されます。

問題は、列幅がすべて同じであるということです。ほとんどの場合、名前と名前は完全に表示されますが、電子メールアドレスがクリップされています。ユーザーはヘッダーの仕切りをダブルクリックして列のサイズを変更できますが、それはすぐに面倒になります。

テーブルが事前入力されたら、プログラムですべての列のサイズを変更して、そこに含まれるデータを表示したいと思いますが、これを実現する方法がわかりません。電話できることはわかりますcol.setPrefWidth(x)が、幅を推測する必要があるため、実際には役に立ちません。

4

7 に答える 7

81

列の総数が事前にわかっている場合。テーブルビューの幅に列幅を分散させることができます。

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

このコードでは、テーブルビューのサイズが変更されても列の幅の比率が同期されているため、手動で行う必要はありません。また、surnameColはテーブルビューの幅の半分のスペースを取ります。

于 2012-04-14T10:47:39.317 に答える
23

これはJavaFX8で機能します

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

問題がある他の例では、垂直スクロールバーの幅は無視されます。

于 2016-02-08T08:42:08.880 に答える
4

SceneBuiderを使用するときは、MinWidthとMaxWidthをいくつかの列に定義し、メイン列にPrefWidthを「USE_COMPUTED_SIZE」に定義するだけです。

于 2016-02-18T11:38:29.843 に答える
3

3年後、ついに解決策を見つけました。テーブルビューの自動調整サイズのjavafx列

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();
                    }
                }
            }
        });
    }
}
于 2016-07-31T17:07:16.380 に答える
3

4つの列があり、テーブルの残りの幅を埋めるために最後の列だけを拡張する必要があり、他の列はSceneBuilderで設定したサイズのままだった場合。

double width = col1.widthProperty().get();
width += col2.widthProperty().get();
width += col3.widthProperty().get();

col4.prefWidthProperty().bind(table.widthProperty().subtract(width));

または、拡張する必要のある2つの列がある場合。

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));
于 2016-08-12T12:37:47.103 に答える
1

また、に基づく非常に単純なトリックAnchorPaneが良い解決策になります。

をにラップしTableViewますが、次のようAnchorPaneに左側と右側を固定します。TableView

AnchorPane wrapper = new AnchorPane();

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

この単純なコードはTableView、両方向(右と左)にも伸び、スクロールバーが追加されるたびに調整されます。

このアニメーションGIFを見ると、これがどのように機能するかがわかります。

ここに画像の説明を入力してください

これで、列のサイズを変更して、次の行を追加できます。

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
于 2018-07-13T09:23:31.330 に答える
0

私の考え。

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));
    }
});
于 2020-08-12T16:00:10.030 に答える