我想建立一个类似这样的非图
但目前我的代码显示的线索(顶部和左侧的数字)是这样的
当我想把线索排成一行的时候,这些线索是叠在一起的。
这是我目前使用javafx的代码:
public class PuzzleView implements FXComponent {
private Controller controller;
private Pane board;
private Pane entirePuzzle;
private VBox[] vertClues;
private HBox[] horzClues;
private Pane[][] tiles;
public PuzzleView(Controller controller) {
this.controller = controller;
}
@Override
public Parent render() {
entirePuzzle = new Pane(); // grid pane
initBoard();
initLabels();
entirePuzzle.getChildren().add(board);
return entirePuzzle;
}
private void initBoard() {
board = new Pane();
int width = controller.getClues().getWidth();
int height = controller.getClues().getHeight();
board.setLayoutX(100);
board.setLayoutY(100);
for (int i=0; i<2; i++) {
for (int j=0; j<2; j++) {
Rectangle clues = new Rectangle();
clues.setWidth(width);
clues.setHeight(height);
clues.setLayoutX(i*(width*50));
clues.setLayoutY(j*height*50);
clues.setStroke(Color.LIGHTBLUE);
clues.setStrokeWidth(2);
clues.setFill(Color.WHITE);
board.getChildren().add(clues);
}
}
tiles = new Pane[width][height];
for (int i=0; i<width; i++) {
for (int j=0; j<height; j++) {
tiles[i][j] = new Pane();
Rectangle rect = new Rectangle(50, 50);
rect.setStroke(Color.LIGHTGRAY);
rect.setStrokeWidth(1);
rect.setFill(Color.TRANSPARENT);
tiles[i][j].getChildren().add(rect);
tiles[i][j].setLayoutX(i*50);
tiles[i][j].setLayoutY(j*50);
board.getChildren().add(tiles[i][j]);
}
}
}
private void initLabels() {
int width = controller.getClues().getWidth();
int height = controller.getClues().getHeight();
vertClues = new VBox[height];
horzClues = new HBox[width];
Clues clue = controller.getClues();
for (int i = 0; i < width; i++) {
horzClues[i] = new HBox();
horzClues[i].setLayoutX(100 + i * width);
for (int j=0; j<controller.getClues().getColCluesLength(); j++) {
horzClues[i].setSpacing(width);
Label label = new Label(String.valueOf(clue.getColClues(i)[j]));
label.minHeight(25);
label.minWidth(25);
horzClues[i].getChildren().add(label);
}
entirePuzzle.getChildren().add(horzClues[i]);
}
for (int i = 0; i < height; i++) {
vertClues[i] = new VBox();
vertClues[i].setLayoutY(100 + i * height);
for (int j=0; j<controller.getClues().getRowCluesLength(); j++) {
Label label = new Label(String.valueOf(clue.getRowClues(i)[j]));
label.minHeight(25);
label.minWidth(25);
vertClues[i].getChildren().add(label);
}
entirePuzzle.getChildren().add(vertClues[i]);
}
}
}
``` `FXComponent` 是我做的一个界面 `render()` 方法返回一个组件对象,我可以将其放在不同的类中。 `controller` 是我创建的另一个类,它允许我访问拼图本身的属性和其他函数。
3条答案
按热度按时间nkcskrwz1#
不是一个完整的答案,只是一个建议,但希望它能帮助你进步。
我建议使用瓷砖板的董事会,其中每个“瓷砖”是一个切换按钮。有关更改按钮颜色的方法,请参阅javafx中的按钮颜色更改
ToggleButton
.以“板”为中心
Node
并将行提示放在左侧Node
列提示为顶部Node
.请注意,下面的代码是基于您的其他问题(您已删除)。
可能有更好的方法来确定“提示”的大小和对齐方式,但我懒得去寻找。
![](https://i.stack.imgur.com/bNA8P.png)
下面是运行应用程序的屏幕截图。
pw136qt22#
我认为最好的方法是使用2x2gridpane来保存行线索、列线索和拼图网格,左上部分留空。所有这三个部分将依次拥有自己的gridpane。所以在2x2屏幕的网格窗格中有3个网格窗格。
然后使用行和列约束来控制所有内容的对齐方式,并使拼图gridpane成为正方形。我已经把它划分成方法,这样数据加载的东西就可以和布局部分清楚地分开。
所以屏幕看起来是这样的:
![](https://i.stack.imgur.com/JdN0t.png)
在看到带有示例nonogram的注解后,我忍不住将其转换为一个完全工作的屏幕。因此,我用一个矩形替换了每个正方形中的“x”,单击可以在0和1之间切换不透明度:
现在看起来是这样的:
![](https://i.stack.imgur.com/YyKSb.png)
fkvaft9z3#
看起来它正按照你的要求做。就像“西风”说的,
GridPane
布局将节省你大量的手动定位。你得换个姿势。他们看起来和我一模一样。但从长远来看,它仍然会给你带来麻烦。如果您最终想要更改窗口大小,布局管理器将为您处理这项工作。