web-dev-qa-db-ja.com

JavaFX 2の自動列幅

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

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

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

43
wobblycogs

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

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

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

71
Uluk Biy

これは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

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

14
Rene Kiupel

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

3
Rubens

3年後、最終的に解決策を見つけました tableview auto fit sizeの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();
                    }
                }
            }
        });
    }
}
3
yelliver

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

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));
2
Kelly Wiles

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

TableViewAnchorPaneにラップするだけでなく、TableViewの左右を次のように固定します。

AnchorPane wrapper = new AnchorPane();

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

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

このアニメーションgifを見て、これがどのように機能するかを知ることができます。

enter image description here

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

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
0
Teocci

Fxmlファイルがある場合はそれを編集することでもできます。

<TableColumn fx:id="blackout_number_column" prefWidth="30.0" text="%number">

パラメーターprefWidthを使用すると、列のデフォルトを変更できます。

0
lmiguelvargasf

幅を一般化して任意の数値を使用し、幅がテーブルの幅の100%であることを確認するには、次を使用できます。

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-------------^-------------^
}
0
YCF_L