irof Advent Calendar のネタを作っていたときに見つけた現象。

環境:Windows7(64bit)、Java1.7.0_10

StackPaneの子として、CanvasとGridPaneをaddAllする。(GridPaneが手前)
GridPaneにボタン、ラベル、テキストフィールドをadd。Canvasには市松模様を描いておく。

  @Override
  public void start(Stage stage) {

    GridPane grid = new GridPane();
    grid.add(new Button("Button1"), 0, 0);
    grid.add(new Button("Button2"), 1, 0);
    grid.add(new Label("Label1"), 0, 1);
    grid.add(new Label("Label2"), 1, 1);
    grid.add(new TextField(), 0, 2);
    grid.add(new TextField("text"), 1, 2);

    Canvas canvas = new Canvas(240, 80);
    GraphicsContext context = canvas.getGraphicsContext2D();
    context.setFill(Color.LIGHTBLUE);
    for(int y = 0; y < 8; y++){
      for(int x = 0; x < 24; x++){
        if((x + y) % 2 == 0){
          context.fillRect(x * 10, y * 10, 10, 10);
        }
      }
    }

    StackPane stack = new StackPane();
    stack.getChildren().addAll(canvas, grid);
    stage.setScene(new Scene(stack));
    stage.show();
  }

表示すると、こんな感じになってしまう。

stackpane1

一つ目のボタンだけ手前に見えて、あとは市松模様の後ろに隠れてしまう。

しかし、ウィンドウサイズを変更すると、全部手前に見えるようになる。

stackpane2

しかし、ボタンにマウスカーソルを合わせたり、テキストフィールドを入力状態にすると、他のコントロールがまた隠れてしまう。

stackpane3
stackpane4

どうやらフォーカスを持つコントロールがあると、それ以外のコントロールがCanvasの後ろに隠れてしまうようだ。

(English