1

私が開発している javafx アプリケーションは、最終的には解像度 800x480 のハンドヘルド デバイスで実行される予定です。通常、アプリケーションは縦向きモードで実行されますが、一部の機能 (グラフやテーブルの表示など) では、データをより適切に表示するために横向きモードに切り替える必要があります。

私の質問は、90 度の倍数で回転するノードを操作する簡単な方法はありますか?

setRotate() を呼び出すことでテーブルを回転できますが、これによりいくつかの新しい問題が発生します。

回転時に列幅のサイズを変更するには、ユーザーは列分割線を左から右 (ヘッダーの行に直交する方向) にドラッグする必要があります。テーブルは依然としてその幅/高さをその親のサイズに拡張しますが、これも同様に機能しません。 -90 度 (またはその他の 90 の倍数) 回転した場合。

もう 1 つの制約は、チャート コンテンツが BorderPane の中央に含まれ、BorderPane の上部と下部にツールバーが含まれているため、シーン全体が回転しないことです。

これが私の SSCCE です。以下のコードに問題がある場合は、修正してください。



    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class TablePanelTrial extends Application {

        BorderPane root = new BorderPane();
        private boolean isRotated=false;

        public static void main(String[] args) {
            launch(args);
        }

        @Override
        public void start(final Stage primaryStage) {
            primaryStage.setTitle("Table Panel Trial");

            final TablePanel tp = new TablePanel();

            Button btnRotate = new Button("Rotate");
            btnRotate.setOnAction(new EventHandler() {
                @Override
                public void handle(ActionEvent event) { 
                    double r = -90;        
                    if(isRotated){
                        r=0;
                        isRotated = !isRotated;
                    }
                    else{
                        r=-90;
                        tp.tv.setMinHeight(200);
                        isRotated = !isRotated;
                    }
                    tp.rotate(r);
                }
            });        

            root.setTop(btnRotate);
            root.setCenter(tp.getVB());
            primaryStage.setScene(new Scene(root, 480, 800));
            primaryStage.show();
        }  

        class TablePanel{
            private VBox vbox = new VBox();
            private TableView tv = new TableView();
            private String[] labelVal = {"Column 1", "Element", "Difference", "File Name", "Report Number"};

            public TablePanel(){
                TableColumn column1 = new TableColumn(labelVal[0]);
                TableColumn column2 = new TableColumn(labelVal[1]);
                TableColumn column3 = new TableColumn(labelVal[2]);
                TableColumn column4 = new TableColumn(labelVal[3]);
                TableColumn column5 = new TableColumn(labelVal[4]);
                tv.getColumns().addAll(column1, column2, column3, column4,column5);
                vbox.getChildren().add(tv);
                tv.setPrefHeight(2000);
            }

            public Pane getVB(){
                return vbox;
            }

            public void rotate(double r){
                vbox.setRotate(r);
            }
        }
    }
    
4

1 に答える 1

0

デバイスが横向きモードになると、Androidは回転機能を実行しないと思います。レイアウトを表示するには、もう一度レイアウトを再描画する必要があります。JavaFX でできることは、シーンにリスナーを追加して幅の変化をリッスンすることです。ほとんどの場合、次のようにできます。


scene.widthProperty().addListener((observable, oldValue, newValue) -> {
         ....initialize the changes to layout here....
    );
});

最善の解決策ではないかもしれませんが、それは何かだと思います。

于 2015-06-17T10:34:35.470 に答える