【发布时间】:2020-07-24 06:56:48
【问题描述】:
我的代码中有以下扩展 JavaFX 对象:
package shipsinspace.view.board;
import javafx.scene.shape.Rectangle;
import shipsinspace.common.Coordinates;
public class Tile extends Rectangle {
private Coordinates coordinates;
public Tile(double width, double height, Coordinates coordinates) {
super(width, height);
this.coordinates = coordinates;
}
public Coordinates getCoordinates() {
return coordinates;
}
}
它使用我编写的这个客户 Java 类来跟踪 Tile 位置:
package shipsinspace.common;
import java.util.Objects;
public class Coordinates {
private int xCoordinate;
private int yCoordinate;
public Coordinates(int xCoordinate, int yCoordinate) {
this(xCoordinate, yCoordinate, 10, false);
}
public Coordinates(int xCoordinate, int yCoordinate, int max) {
this(xCoordinate, yCoordinate, max, false);
}
public Coordinates(int xCoordinate, int yCoordinate, int max, boolean allowedZero) {
if (allowedZero) {
if ((xCoordinate >= 0 && yCoordinate >= 0) && (xCoordinate <= max && yCoordinate <= max)) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
} else {
throw new IllegalArgumentException(String.format("Either X or Y has set to value <= 0, or > %d", max));
}
} else {
if ((xCoordinate > 0 && yCoordinate > 0) && (xCoordinate <= max && yCoordinate <= max)) {
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
} else {
throw new IllegalArgumentException(String.format("Either X or Y has set to value <= 0, or > %d", max));
}
}
}
public int getX() {
return xCoordinate;
}
public int getY() {
return yCoordinate;
}
public Coordinates returnNeighbour(int axis, int direction) {
if (axis == 0) {
try {
return new Coordinates(this.getX() + direction, this.getY());
} catch (IllegalArgumentException e) {
return new Coordinates(this.getX(), this.getY());
}
} else {
try {
return new Coordinates(this.getX(), this.getY() + direction);
} catch (IllegalArgumentException e) {
return new Coordinates(this.getX(), this.getY());
}
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Coordinates that = (Coordinates) o;
return xCoordinate == that.xCoordinate &&
yCoordinate == that.yCoordinate;
}
@Override
public int hashCode() {
return Objects.hash(xCoordinate, yCoordinate);
}
@Override
public String toString() {
return String.format("Coordinates (%d, %d)", xCoordinate, yCoordinate);
}
}
现在,我想构建一个场景(通过 JavaFX Scene Builder),它使用 GridPane,每个单元格中都有一个 TILE 对象。我决定首先在 Scene Builder 中构建一个场景,使用 JavaFX Rectangle 对象而不是 Tiles,然后手动编辑 .fxml 文件并将 Rectangle 更改为 Tile 对象。问题是,Intellij 现在告诉我 FXML 文件中的 Tile 对象无法实例化:
...
<center>
<GridPane BorderPane.alignment="CENTER">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Tile arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="52.0" stroke="BLACK" strokeType="INSIDE" width="53.0" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="1.0" left="1.0" right="1.0" top="1.0" />
</GridPane.margin>
</Tile>
...
我可以说,这是因为我的 Tile 对象需要将 Coordinates 对象传递给它的构造函数,而不是高度和宽度,但我不知道如何将它们粘贴到 FXML 代码中。任何帮助将不胜感激。
【问题讨论】:
-
在必要时添加@NamedArg 标签后,如何在FXML 文件中的Tile 对象行上“实例化”坐标对象?