Locked History Actions

JavaFX/FreeLayout

自由にレイアウトする

自由にレイアウトする

既存のレイアウタでは不可能な「おかしなこと」をやりたい時、自身でレイアウトする必要があるが、この方法の一つとして以下がある。 以下ではボタンがテキスト領域の一部に入り込んでレイアウトされる。

If you want to do weired things on layouting which can't be achieved by standard layouters, one of the ways is the following. A Button is layouted overlapping TextArea.

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;

public class FreeLayout extends Application {

  @Override
  public void start(Stage stage) throws Exception {

    TextArea textArea = new TextArea();
    Button button = new Button("some button");    
    Pane pane = new Pane() {
      @Override
      protected void layoutChildren() {
        super.layoutChildren();
        double width = getWidth();
        double height = getHeight();
        textArea.resize(width,  height);
        button.relocate(width - button.getWidth() - 10, height - button.getHeight() - 10);
      }
    };
    pane.getChildren().addAll(textArea, button);    
    stage.setScene(new Scene(pane));
    stage.setWidth(500);
    stage.setHeight(500);
    stage.show();
  }

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

レイアウトを強制する

レイアウトをわざと強制するには以下。

Forcing layouting on purpose.

import java.util.*;

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;

public class RequestLayout extends Application {

  @Override
  public void start(Stage stage) throws Exception {    
    Button button = new Button("layout"); 
    Pane pane = new Pane() {    
      Random r = new Random();
      @Override
      public void layoutChildren() {
        System.out.println("layoutChildren");
        super.layoutChildren();
        button.relocate(
          (getWidth() - button.getWidth()) * r.nextDouble(), 
          (getHeight() - button.getHeight()) * r.nextDouble()
        );
      }
    };
    button.setOnAction(e-> {  
      System.out.println("clicked");
      pane.requestLayout();              
    });
    pane.getChildren().add(button);
    Scene scene = new Scene(pane);
    stage.setScene(scene);
    stage.setWidth(400);
    stage.setHeight(400);
    stage.show();
  }
  
  public static void main(String[] args) throws Exception {
    launch(args);
  }
}