「//fix this/」の記事インデックス

//fix this/ Javaコードの間違いをさがせ!


このシリーズは、あなたのコーディング・スキルを試すコーナーです。毎号オラクルのJavaエバンジェリストたちが、Javaコードに関する難問を出題し、正解と解説を掲載します。是非、毎号チャレンジして貴方のコーディング能力の向上にお役立て下さい。


第9回目 (Java Magazine 2013/July-Augからの出題)


1. 今回のテーマ 「JavaFX:SplitPaneの問題」 

JavaFX で SplitPane コントロールを使用して、2 つの部分からなるユーザー・インタフェースのサイズ比率をユーザーが変更できるようにする必要があります。 問題は、SplitPane 内のディバイダの両側をサイズ変更できるようにするには、どのような方法でノードを追加すれば良いのかという点です。



2. コード

SplitPane 内のディバイダの両側にボタンを配置する、単純な JavaFX アプリケーションに対する次の start メソッドについて考えてみましょう。


@Override
public void start(Stage stage) {
 SplitPane splitPane = new SplitPane();
 Button one = new Button("Left Button");
 Button two = new Button("Right Button");
 splitPane.getItems().addAll(one, two);
 Scene scene = new Scene(splitPane, 600, 200);
 stage.setScene(scene);
 stage.show();
}

このアプリケーションを実行すると、ディバイダの左側は " 左ボタン " で満たされ、ディバイダのすぐ右側が " 右ボタン " になります。どちらかの方向にディバイダをドラッグしようとても、変化はありません。



3.正しいのはどれ?

上記のコードの正しい修正方法を選んでください。

1) ObservableList の addAll() メソッドを使用して 2 つのボタンを追加する代わりに、add() メソッドを 2 回個別に呼び出して順番にボタンを追加する必要がある。

2) レイアウトが正しく再計算されるように、SplitPane に対して requestLayout() を呼び出す。

3) 各 Button オブジェクトを別々の Pane 内に配置し、SplitPane にはボタンではなくペインを追加する。

Pane left = new Pane();
left.getChildren().add(one);
Pane right = new Pane();
right.getChildren().add(two);
stackPane.getItems().addAll(left, right);


4) setDividerPosition を使用して、ディバイダの位置を明示的に中央に設定する。

splitPane.setDividerPosition(0.5);


<ヒント>
ノードのサイズがどのような効果をもたらすかを考えること

 






【答え】

正解は 3)です。それぞれのボタンを別々のペイン(StackPane や FlowPane、またはその他のサブクラスでも可)に配置する必要があります。アプリケーションを実行すると、ウィンドウの中央にディバイダが表示され、半分になった SplitPane のそれぞれの左上にボタンが表示されます。


<< 第8回へ戻る I 第10回へ進む >>

「//fix this/」の記事インデックス