- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设计一个西洋跳棋游戏,游戏完成后,会打开一个新窗口,您可以在其中开始新游戏或退出。我对 JavaFX 不太了解,并且我已经尝试了一段时间让我的代码正常工作,但我没有成功......
我有一个困难,我的板没有显示为 fxml 文件,但它是用 javacode 创建的并放在 borderPane 的中心。 borderPane 的顶部是 fxml 文件。然后,游戏结束后,另一个窗口也是另一个 fxml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<Pane fx:id="paneMenu" nodeOrientation="LEFT_TO_RIGHT" prefHeight="160.0" prefWidth="240.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.GameMenuController">
<children>
<Button fx:id="buttonRestart" layoutX="15.0" layoutY="122.0" mnemonicParsing="false" onAction="#restart" prefHeight="27.0" prefWidth="90.0" text="New Game" />
<Button fx:id="buttonQuit" layoutX="139.0" layoutY="122.0" mnemonicParsing="false" onAction="#quit" prefHeight="27.0" prefWidth="90.0" text="Quit" />
<Label fx:id="labelWinner" alignment="CENTER" contentDisplay="CENTER" layoutX="23.0" layoutY="80.0" prefHeight="17.0" prefWidth="190.0" text="Label" textAlignment="CENTER" />
<Text layoutX="50.0" layoutY="47.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Game over!" textAlignment="CENTER">
<font>
<Font size="26.0" />
</font>
</Text>
</children>
<padding>
<Insets bottom="10.0" right="10.0" />
</padding>
</Pane>
此 fxml 文件的 Controller 类如下所示:
public class GameMenuController implements Initializable {
public GameMenuController(Checkers model) {
this.content = model;
}
Checkers content;
@FXML
private Label labelWinner;
@FXML
private Button buttonRestart;
@FXML
private Button buttonQuit;
@FXML
private Pane paneMenu;
BooleanProperty doRestart = new SimpleBooleanProperty(false);
@FXML
void restart(ActionEvent event) {
content.cleanup();
doRestart.set(true);
}
@FXML
void quit(ActionEvent event) {
System.exit(0);
}
@Override
public void initialize(URL location, ResourceBundle resources) {
labelWinner.setText("Winner here.");
labelWinner.textProperty().bind(Bindings.createStringBinding(() -> {
String s = " ";
if (...);
return s;
}, content.whiteTurnProp));
}
}
最后,在我的主类中,我想向值 doRestart 添加一个 ChangeListener,以便重新创建一个新场景。
我的主类看起来像这样:
public class Main extends Application{
Checkers content = new Checkers();
BorderPane border = new BorderPane();
Pane paneBoard = new Pane();
FXMLLoader loader1 = new FXMLLoader();
FXMLLoader loader2 = new FXMLLoader();
@Override
public void start(Stage primaryStage) throws Exception {
loader1.setLocation(getClass().getResource("sample.fxml"));
loader1.setControllerFactory(new Callback<Class<?>, Object>() {
@Override
public Object call(Class<?> aClass) {
return new SampleController(content);
}
});
loader2.setLocation(getClass().getResource("GameMenu.fxml"));
loader2.setControllerFactory(new Callback<Class<?>, Object>() {
@Override
public Object call(Class<?> aClass) {
return new GameMenuController(content);
}
});
GameMenuController gameMenuControl = loader2.getController();
Scene scene = new Scene(startGame());
primaryStage.setTitle("Checkers");
primaryStage.setScene(scene);
primaryStage.show();
content.gameOver.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
try {
scene.setRoot(loader2.load());
primaryStage.setHeight(180);
primaryStage.setWidth(240);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
gameMenuControl.doRestart.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if(newValue) {
scene.setRoot(startGame());
primaryStage.setHeight(scene.getHeight());
primaryStage.setWidth(scene.getWidth());
gameMenuControl.doRestart.set(false);
}
}
});
}
public static void main(String[] args) {
launch(args);
}
protected Pane createContent() {
paneBoard.setPrefSize(Checkers.WIDTH * Checkers.TILE_SIZE, Checkers.HEIGHT * Checkers.TILE_SIZE);
paneBoard.getChildren().addAll(content.tileGroup, content.pieceGroup);
for (int y = 0; y < Checkers.HEIGHT; y++) {
for (int x = 0; x < Checkers.WIDTH; x++) {
Tile tile = new Tile((x + y) % 2 == 0, x, y);
Checkers.board[y][x] = tile;
content.tileGroup.getChildren().add(tile);
Piece piece = null;
if (y <= 3 && (x + y) % 2 != 0) {
piece = content.makePiece(PieceType.BLACK, x, y);
}
if (y >= 6 && (x + y) % 2 != 0) {
piece = content.makePiece(PieceType.WHITE, x, y);
}
if (piece != null) {
tile.setPiece(piece);
content.pieceGroup.getChildren().add(piece);
}
}
}
return paneBoard;
}
protected BorderPane startGame() {
try {
border.setTop(loader1.load());
} catch (IOException e) {
e.printStackTrace();
}
border.setCenter(createContent());
return border;
}
}
我很确定我的代码一团糟,我一直在尝试尽可能多地使用这里给出的提示,但由于我对此仍然非常陌生,我真的不知道如何去做这一切吧。
我想做的,不是使用这个更改监听器(这也不起作用,我收到 NullPointerException),而是直接从我的 Controller 更改 View 。我该怎么办?
1)我可以不通过工厂创建 Controller ,而是让他们以其他方式访问我的模型检查器吗? (所有游戏逻辑都存储在那里等)
2)我基本上如何重新创建我的第一个窗口? (由 startGame()
创建)
非常感谢!!最好的,丽莎
最佳答案
您在调用loader2.load()
之前调用GameMenuController gameMenuControl = loader2.getController()
。 Controller 是作为加载过程的一部分创建的,因此 gameMenuControl
将为 null。
您可以简单地将对 loader2.getController()
和 gameMenuControl.doRestart.addListener(...)
的调用移至调用 loader2.load 之后立即进行()
.
或者,您可以自己创建 Controller ,而不是委托(delegate)给 Controller 工厂。 从 FXML 文件中删除 fx:controller
属性,然后执行以下操作:
@Override
public void start(Stage primaryStage) throws Exception {
// You can make similar changes to loader1 if you want...
loader2.setLocation(getClass().getResource("GameMenu.fxml"));
GameMenuController gameMenuControl = new GameMenuController(content) ;
gameMenuControl.doRestart.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if(newValue) {
scene.setRoot(startGame());
primaryStage.setHeight(scene.getHeight());
primaryStage.setWidth(scene.getWidth());
gameMenuControl.doRestart.set(false);
}
}
});
loader2.setController(gameMenuControl);
content.gameOver.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
try {
scene.setRoot(loader2.load());
primaryStage.setHeight(180);
primaryStage.setWidth(240);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Scene scene = new Scene(startGame());
primaryStage.setTitle("Checkers");
primaryStage.setScene(scene);
primaryStage.show();
}
关于java - 从 Controller JavaFX 打开新场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43921629/
websocket的用途/场景 先总结:高即时性服务,比如聊天室的群聊,server顺序收到了张三,李四的消息,立即就推送给王五,不能让王五等半天。 Ajax也可以一秒一刷,让王五去问张三说话没,如果
前端的工作过程里,本地开发、提供测试环境,总得有个用着顺手的服务器软件,这个场景里nginx很流行。 介绍两个好用的配置项:rewrite try_files @xxxx rewrite 比较
我有一个场景的两个不同角度的 2 个视频文件,我想重建场景的 3D 估计。它类似于 3D 传感器的作用(例如 Kinect、PrimeSense)。我正在寻找一个库,甚至是一个完善的机器视觉算法,以便
我已阅读RebaseProject页面并尝试了一个不平凡的例子(不是对一个完整的分支进行 rebase )。这与 rebase D 的情况类似我场景B。 这是rebase之前的情况: default
有没有办法将我的场景保存在 JavaFx 应用程序中单独的 Java 文件中?我尝试过这样的事情: public class MyApp extends Application { pri
我有这样的场景:用户想要查看大量有关自己的信息。例如:年龄、姓名、地位、收入、工作、爱好、 child 的名字、妻子的名字、酋长的名字、祖父/祖母的名字。大约 50 个变量。他可以选择任何变量来显示信
我希望有人能帮助我解决这个问题:我有一个包含条目的表。我想执行查询并根据模式获取得分最高的记录。模式将是:如果我的话按原样出现,那么该条目的分数将是最高的。如果该单词出现在句子中,则该条目的分数将低于
我正在尝试在我的应用程序委托(delegate)方法中实现一些逻辑。了解当前正在运行哪种场景将非常有帮助。 [[CCDirector sharedDirector] runningScene] 返回当
好的,这是一个有趣的。我有 2 个表:tbl_notes、tbl_notes_categories 简单地说,tbl_notes 有一个 categoryid,我将 2 个表与该 ID 相关联。所以,
我有一个使用并行运行的 Specflow、selenium、NUnit 的测试解决方案在 AssemblyInfo 中添加了这个:[程序集:Parallelizable(ParallelScope.F
我正在尝试弄清楚如何在 SpriteKit 中添加更多场景。如果我在 GameViewController 中使用 SpriteKit 生成的行 if let scene = GameScene.un
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我是 Unity 的新手,所以修复起来可能非常简单。我使用了一个 3D Google SketchUp 模型,我想让玩家环顾模型。 super 简单。 我添加了 3D 平面,添加了相机并更新了设置以支
我需要标记要跳过的某些测试。但是,有些测试是参数化的,我只需要能够跳过某些场景。 我使用 py.test -m "hermes_only" 调用测试或 py.test -m "not hermes_o
我已经开始使用 SpecFlow 并想知道是否可以在规范之间重用场景 基本上我的想法是这样的(我可能从根本上是错误的:)) 我编写了一项功能来验证导航。 功能:导航 I should be able
在编写验证输入表单上的信息的 BDD 场景时,您将如何列出规则。 选项是: 1) 每个规则一个场景 2)场景大纲,每个领域和规则的例子 我们如何说某些不在特定字符集中的无效内容,例如: 鉴于我输入了一
我们如何使用 StoryQ 来测试预期出现异常的场景? 最佳答案 就实际代码而言,在测试代码的 .Then 部分,您需要创建一个 Action 或 Func 来确定正在测试的内容,然后在代码的 .Th
完成快速初学者努力通过点击按钮向场景添加节点。 我知道我可以使用点击手势来获取点击坐标并执行点击测试,然后在点击的 3D 空间中放置一个对象。但是,我想在设备屏幕的中央显示一个球体或十字准线,当点击屏
如何在表格中传递空格? Background: Given the following books |Author |(here several spaces)
我正在尝试从 Eric Haines' Standard Procedural Database (SPD) 渲染“mount”场景,但折射部分就是不想配合。我已经尝试了所有我能想到的方法来修复它。
我是一名优秀的程序员,十分优秀!