2016-12-01 14 views
0

定義されたサイズのボックス全体に均等に3行ずつ配信するために9桁の数字を取得しようとしています。JavaFXパネル全体で均等に9桁の数字を配布しレイアウトする方法

これまでのところ、私は途中で凝集しから番号を防止することが見出された唯一の一貫性のある方法は、追加することです中央の桁に2つの余分なスペース、それぞれの側に1つ余分なスペース文字(例: "2"、 "5"、 "8")。確かに、これらの数字をこれよりもレイアウトする方がいいですか?

パブリッククラスDemoCodeは、あなたがあなたのレイアウトにTilePaneまたはGridPaneを使用することができ、アプリケーション{

// Private Class  
    class PossibleCellValue extends Text { 

     PossibleCellValue(String value) { 
     super(value); 
     setFont(FONT_FOR_POSSIBLE_VALUES); 
     } 
    } 

    // Private Class 
    class Cell extends VBox { 
     Cell() { 
      super(); 
      this.setBorder(borderBlack); 
      this.setPrefSize(CELL_SIZE, CELL_SIZE); 
      PossibleCellValue guess1 = new PossibleCellValue("1"); 
      PossibleCellValue guess2 = new PossibleCellValue(" 2 "); 
      PossibleCellValue guess3 = new PossibleCellValue("3"); 
      PossibleCellValue guess4 = new PossibleCellValue("4"); 
      PossibleCellValue guess5 = new PossibleCellValue(" 5 "); 
      PossibleCellValue guess6 = new PossibleCellValue("6"); 
      PossibleCellValue guess7 = new PossibleCellValue("7"); 
      PossibleCellValue guess8 = new PossibleCellValue(" 8 "); 
      PossibleCellValue guess9 = new PossibleCellValue("9"); 
      HBox box1 = new HBox(guess1, guess2, guess3); 
      HBox box2 = new HBox(guess4, guess5, guess6); 
      HBox box3 = new HBox(guess7, guess8, guess9); 
      VBox vbox = new VBox(box1, box2, box3); 
      getChildren().add(vbox); 
      this.setAlignment(Pos.CENTER); 
     } 
    } 

    // Normal start method 
    public void start(Stage stage) throws Exception { 
     Scene scene = new Scene(new Cell()); 
     stage.setScene(scene); 
     stage.setTitle("Demo Code"); 
     stage.show(); 
    } // DemoCode 

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

    static protected final BorderStroke strokeBlack = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderStroke.THIN); 
    public static final Border   borderBlack = new Border(strokeBlack); 

    private static final int FONT_SIZE_FOR_POSSIBLE_VALUES = 15; 
    private static final Font FONT_FOR_POSSIBLE_VALUES  = Font.font("Courier", FontWeight.NORMAL, FONT_SIZE_FOR_POSSIBLE_VALUES); 
    static protected final int CELL_SIZE      = 54; 

} // DemoCode.java 
+0

質問は、Oracleのフォーラムにクロスポストだったし、そこに答えた:[パネル全体に均一に9桁の数字を配布し、レイアウト](HTTPS: //community.oracle.com/thread/3996086) – jewelsea

答えて

1

を拡張します。ここで

はTilePaneを使った例です:

grid

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

import java.util.stream.IntStream; 

public class GridViewer extends Application { 

    private static final int S = 3; 
    private static final double PANE_SIZE = 54 * S; 

    public void start(Stage stage) { 
     TilePane tiles = new TilePane(
       0, 0, 
       IntStream.range(1, 10) 
         .mapToObj(this::createGridCell) 
         .toArray(Node[]::new) 
     ); 

     tiles.setMinSize(TilePane.USE_PREF_SIZE, TilePane.USE_PREF_SIZE); 
     tiles.setMaxSize(TilePane.USE_PREF_SIZE, TilePane.USE_PREF_SIZE); 
     tiles.setPrefSize(PANE_SIZE, PANE_SIZE); 
     tiles.setPrefColumns(S); 
     tiles.setAlignment(Pos.BASELINE_CENTER); 
     tiles.setPrefTileHeight(PANE_SIZE/S); 
     tiles.setPrefTileWidth(PANE_SIZE/S); 

     StackPane root = new StackPane(tiles); 
     root.setPadding(new Insets(10)); 
     stage.setScene(new Scene(root)); 
     stage.show(); 
    } 

    private Node createGridCell(int i) { 
     Label label = new Label("" + i); 
     label.setStyle("-fx-background-color: cyan; -fx-border-color: green;"); 

     label.setPrefSize(PANE_SIZE/S, PANE_SIZE/S); 
     label.setAlignment(Pos.BASELINE_CENTER); 

     return label; 
    } 

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

ありがとうございます。これは非常に素晴らしく、簡潔な解決策です。しかし、最小/最大サイズをTilePane.USE_PREF_SIZE以外に設定した場合や、setPrefSize(54,54)を設定した場合、(3)の優先カラム数はレイアウトマネージャによって無視されます。私の意図は、数独のゲームの中でこれをセルとして使用することです。そのため、長方形の形状が重要です。 –

+0

私の答えは長方形を提供します。私はあなたの問題を理解していません。 GridPaneは、TilePaneに対して追加の制約の可能性を提供するので、代わりにその選択を使用することができます。 – jewelsea

+0

私は間違いました。私は、形状が特定の大きさの正方形である必要があると言っていました。 –

関連する問題