私は、カスタムTableColumnの幅リサイズポリシーを書きました。あなたは、Java 8 / JavaFXの8の下にそのコードを見ることができますgithubの上でここに。あなたが見ることができるように、この方法ではdistributeSpaceRatio()
、他の場所、それが依存するTableColumn.impl_setWidth()
我々の計算を行った後に所望の値に列の幅を設定します。
私はJavaの11 / JavaFXの11に私のプロジェクトを移行していますし、この方法は、impl_setWidth()
パブリックビューから削除されました。
その幅を設定するには、テーブルの列を伝えるための別の方法はありますか?それは信頼性が高く、要求された値(または近い)にして設定されますように私は限りあらゆるソリューションに開いています。
ここで私は動作しませんでしたこと、これまで試した2つのアイデアがあります:
1を試みます:
この1はNoMethodFoundExceptionを与えます:
private void setColumnWidth ( TableColumn column, double targetWidth ) {
try {
Method method = column.getClass().getDeclaredMethod( "setWidth" );
method.setAccessible( true );
Object r = method.invoke( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
2を試みます:
この1は効果がありません。
private void setColumnWidth ( TableColumn column, double targetWidth ) {
double oldMax = column.getMaxWidth();
double oldMin = column.getMinWidth();
double oldPref = column.getPrefWidth();
column.setMaxWidth( targetWidth );
column.setMinWidth( targetWidth );
column.setPrefWidth( targetWidth );
column.getTableView().refresh();
column.setPrefWidth( oldPref );
column.setMinWidth( oldMin );
column.setMaxWidth( oldMax );
}
3を試みます:
JavaFXの者のためのソースを見るとTableView.UNCONSTRAINED_RESIZE_POLICY
、呼び出されたメソッドが最終的であると思われるTableColumnBase.doSetWidth()
も、ここで私のために仕事をしないしかしことを、:
private void setColumnWidth ( TableColumn column, double targetWidth ) {
try {
Method method = column.getClass().getDeclaredMethod( "doSetWidth" );
method.setAccessible( true );
Object r = method.invoke( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
4を試みます:
私はまた、中に提供される解決策使用してみました。この答えをプライベートメソッドを実行すると、同じ例外が発生しました- 「何の方法ではありません名前doSetWidthとのparams [クラスjava.lang.Doubleの]で見つかりました」。
5を試みます:
私はこの1つは仕事に行っていたと思っていないが、そのような幸運。「:幅java.lang.NoSuchFieldExceptionの」それは投げました。私はTableColumnBaseのソースコードに行くときしかし、私ははっきりと線412の幅というプライベートフィールドに表示されます。これが失敗した理由はわかりません。
private void setColumnWidth ( TableColumnBase column, double targetWidth ) {
try {
Field widthField = column.getClass().getDeclaredField( "width" );
widthField.setAccessible( true );
ReadOnlyDoubleWrapper width = (ReadOnlyDoubleWrapper)widthField.get( column );
width.set( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
6を試みます:
これは近い私たちを得たが、それでも失敗しました:
private void setColumnWidth ( TableColumnBase column, double targetWidth ) {
try {
Field widthField = column.getClass().getSuperclass().getDeclaredField( "width" );
widthField.setAccessible( true );
ReadOnlyDoubleWrapper width = (ReadOnlyDoubleWrapper)widthField.get( column );
width.set( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
java.lang.reflect.InaccessibleObjectException:フィールドプライベートjavafx.beans.property.ReadOnlyDoubleWrapper javafx.scene.control.TableColumnBase.widthアクセス可能にすることができません:モジュールjavafx.controlsをしていない無名のモジュールへの「javafx.scene.controlを開き、」@ 649dcffc
7を試みます:
private void setColumnWidth ( TableColumn column, double targetWidth ) {
try {
Method method = column.getClass().getSuperclass().getDeclaredMethod( "setWidth", double.class );
method.setAccessible( true );
method.invoke ( targetWidth );
//ReadOnlyDoubleWrapper width = (ReadOnlyDoubleWrapper)widthField.get( column );
//width.set( targetWidth );
} catch ( Exception e ) {
e.printStackTrace();
}
}
java.lang.reflect.InaccessibleObjectException:無効javafx.scene.control.TableColumnBase.setWidth(ダブル)アクセス可能にすることができません:モジュールjavafx.controlsをしていない無名のモジュールへの「javafx.scene.controlを開き、」@ 5063f647
テストと他人の助けに基づいて、私はこの解決策を見つけました:
private void setColumnWidth ( TableColumn column, double targetWidth ) {
try {
Method method = TableColumnBase.class.getDeclaredMethod( "doSetWidth", double.class );
method.setAccessible( true );
method.invoke( column, targetWidth );
} catch ( NoSuchMethodException | InvocationTargetException | IllegalAccessException e ) {
e.printStackTrace();
}
}
また、JVMは、次の引数で呼び出される必要があります。
--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED