我正在尝试制作Java Sudoku游戏。我无法将Sudoku输入矩形对齐。由于输入板底部的按钮,它们被移开了。如何在expected.jpg
中对齐Main.java
之类的矩形。我只想通过Buttons
文件制作Input Rectangles
和Main.java
。如果无法通过Main.java
进行对齐,请告诉我。谢谢
expected.jpg
:
what_i_get.jpg
:
Main.java
:
package application;
import java.util.*;
import javafx.scene.shape.Rectangle;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
public class Main extends Application {
int[][] original_map;
StackPane[][] screen_buttons = new StackPane[10][10];
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root,600,700);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
GridPane root = new GridPane();
root.setPadding(new Insets(10));
root.setHgap(10);
root.setVgap(10);
Scene scene = new Scene(root, 700, 700);
primaryStage.setScene(scene);
// USING SUDOKU.java to build the Sudoku Game
Sudoku map = new Sudoku();
// STORING the sudoku game in the 2x2 array
this.original_map = map.make_game();
for (int y=0;y<9;y++) {
for (int x=0;x<9;x++) {
screen_buttons[y][x] = new StackPane();
Rectangle rec = new Rectangle(30,30);
rec.setFill(javafx.scene.paint.Color.WHITE);
rec.setStyle("-fx-arc-height: 10; -fx-arc-width: 10;");
Label label = new Label(Integer.toString(this.original_map[y][x]));
screen_buttons[y][x].getChildren().addAll(rec, label);
root.add(screen_buttons[y][x], x, y);
}
}
Button[] function_buttons = new Button[4];
String[] function_id = {"Hint", "Clear", "Pause", "Check"};
int pos = 0;
for (Button b : function_buttons) {
if (function_id[pos] == "Hint") {
b = new Button(function_id[pos]);
root.add(b, 1, pos+10);
} else if (function_id[pos] == "Clear"){
b = new Button(function_id[pos]);
root.add(b, 1, pos+10);
} else if (function_id[pos] == "Pause"){
b = new Button(function_id[pos]);
root.add(b, 1, pos+10);
} else {
b = new Button(function_id[pos]);
root.add(b, 6, 11);
}
b.setStyle("-fx-pref-width: 100px; -fx-pref-height: 50px;");
pos++;
}
Button[] click_buttons = new Button[9];
pos = 1;
for (int y=10;y<=12;y++) {
for (int x=2;x<=4;x++) {
click_buttons[pos-1] = new Button(Integer.toString(pos));
root.add(click_buttons[pos-1], x, y);
click_buttons[pos-1].setStyle("-fx-pref-width: 50px; -fx-pref-height: 50px;");
pos++;
}
}
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:3)
这里有几个问题(主要和次要问题)。
首先,将screen_buttons
声明为StackPane[10][10]
,这以后可能会给您带来麻烦。
第二,我不知道为什么创建了两个根节点和两个场景。可以,但是完全没有必要。
第三,您的GridPane
用作显示网格和控制按钮的公用根。下面的所有按钮都会影响顶部网格上的列宽。您需要将两者分开。您可以使用包含两个BorderPane
子节点的GridPane
-一个用于显示,另一个用于控制。
最后,执行Label label = new Label(Integer.toString(this.original_map[y][x]))
将使您的网格显示 static 值。尽管这对于使用值预先生成的网格看起来不错,但是当玩家在网格上放置数字时可能会出现问题。当然,您可以手动在用户执行操作时设置相应网格的文本,但这会使在此处保留2个数组变得多余。
答案 1 :(得分:3)
一种更好地控制布局的常见策略是将其细分为更小,更易于管理的容器,每个容器都有自己的布局管理器。
在这种情况下,请按照Jai的建议,将游戏及其控件分成两个容器:
public class Main extends Application {
StackPane[][] screen_buttons = new StackPane[9][9];
@Override
public void start(Stage primaryStage) {
//container for game
BorderPane root = new BorderPane();
GridPane grid = new GridPane();
grid.setPadding(new Insets(10));
grid.setHgap(10);
grid.setVgap(10);
for (int y=0;y<screen_buttons.length;y++) {
for (int x=0;x<screen_buttons[y].length;x++) {
screen_buttons[y][x] = new StackPane();
Rectangle rec = new Rectangle(30,30);
rec.setFill(javafx.scene.paint.Color.WHITE);
rec.setStyle("-fx-arc-height: 10; -fx-arc-width: 10;");
Label label = new Label("0");
screen_buttons[y][x].getChildren().addAll(rec, label);
grid.add(screen_buttons[y][x], x, y);
}
}
//container for controls
GridPane controls = new GridPane();
Button[] function_buttons = new Button[4];
String[] function_id = {"Hint", "Clear", "Pause", "Check"};
int pos = 0;
for (Button b : function_buttons) {
if (function_id[pos] == "Hint") {
b = new Button(function_id[pos]);
controls.add(b, 1, pos+10);
} else if (function_id[pos] == "Clear"){
b = new Button(function_id[pos]);
controls.add(b, 1, pos+10);
} else if (function_id[pos] == "Pause"){
b = new Button(function_id[pos]);
controls.add(b, 1, pos+10);
} else {
b = new Button(function_id[pos]);
controls.add(b, 6, 11);
}
b.setStyle("-fx-pref-width: 100px; -fx-pref-height: 50px;");
pos++;
}
Button[] click_buttons = new Button[9];
pos = 1;
for (int y=10;y<=12;y++) {
for (int x=2;x<=4;x++) {
click_buttons[pos-1] = new Button(Integer.toString(pos));
controls.add(click_buttons[pos-1], x, y);
click_buttons[pos-1].setStyle("-fx-pref-width: 50px; -fx-pref-height: 50px;");
pos++;
}
}
root.setCenter(grid);
root.setBottom(controls);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}