column.impl_setWidth用のJavaFX 11交換()?

JoshuaD:

私は、カスタム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

JoshuaD:

テストと他人の助けに基づいて、私はこの解決策を見つけました:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212358&siteId=1