使用图形视图和scenebuilder运行javaFX应用程序时显示空窗口
我目前正在写一个扑克游戏作为期末考试的作业。我必须使用一个组合视图:一个包含实际代码和Scenebuilder的类。我做了我学到的一切,模型工作得很好。我是新来的,所以这一定很容易解决!教授们想让我们熟悉Scenebuilder,但他们没有给出太多解释 如您所见,我使用了一个名为pokerView的类,在该类中,我加载了每张卡的图像。在开始的时候,我使用了一个奇怪的forloop来自动生成图像的名称,我把它打印出来,url就可以了 我还使用scenebuilder。它有自己的控制器/视图类,即FXMLPoker控制器 为了将两者结合起来,我使用了“超级”视图 有趣的是java没有给我任何错误 我真的需要一个答案。如果窗口显示为空,则无法显示应用程序 所以终端在使用printstacktrace时会给出以下几行使用图形视图和scenebuilder运行javaFX应用程序时显示空窗口,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,我目前正在写一个扑克游戏作为期末考试的作业。我必须使用一个组合视图:一个包含实际代码和Scenebuilder的类。我做了我学到的一切,模型工作得很好。我是新来的,所以这一定很容易解决!教授们想让我们熟悉Scenebuilder,但他们没有给出太多解释 如您所见,我使用了一个名为pokerView的类,在该类中,我加载了每张卡的图像。在开始的时候,我使用了一个奇怪的forloop来自动生成图像的名称,我把它打印出来,url就可以了 我还使用scenebuilder。它有自己的控制器/视图类,即F
javafx.fxml.LoadException:
file:/Users/test/Documents/2%20aba/Informatica/Netbeans%20projecten/poker/dist/run1845271650/poker.jar!/poker/FXMLpoker.fxml:10
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at poker.ViewPlus.<init>(ViewPlus.java:30)
at poker.MAINpoker.start(MAINpoker.java:27)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.IllegalArgumentException: Can not set javafx.scene.control.Button field poker.FXMLpokerController.deal to javafx.scene.layout.AnchorPane
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1163)
at javafx.fxml.FXMLLoader.access$1600(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:857)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:751)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
... 10 more
}
这是视图控制器
package poker;
public class Controller {
private Game model;
private ViewPlus view;
public Controller(Game model, ViewPlus view){
this.model=model;
this.view=view;
view.configureerKaarten();
view.turnHandCards();
if(model.getRound().getSpeler1().getStake() == model.getRound().getSpeler2().getStake()
&& model.getRound().getSpeler2().getStake() == model.getRound().getSpeler3().getStake()
&& model.getRound().getSpeler3().getStake() == model.getRound().getSpeler4().getStake()){
view.turnThreeTableCards();
}
}
}
这是我的主课
package poker;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MAINpoker extends Application {
@Override
public void start(Stage stage) throws Exception {
Game model = new Game();
ViewPlus view = new ViewPlus (model);
Scene scene = new Scene(view);
stage.setScene(scene);
stage.show();
Controller c = new Controller(model, view);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
这是我的FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.image.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" fx:id="deal" prefHeight="605.0" prefWidth="556.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="poker.FXMLpokerController">
<children>
<Button layoutX="484.0" layoutY="556.0" mnemonicParsing="false" text="ready" />
<Button layoutX="249.0" layoutY="495.0" mnemonicParsing="false" text="deal" />
<Label layoutX="393.0" layoutY="495.0" prefHeight="42.0" prefWidth="160.0" text="minimum stake">
<graphic>
<TextArea fx:id="minimumStake" prefHeight="28.0" prefWidth="28.0" />
</graphic>
</Label>
<Button fx:id="raise" layoutX="14.0" layoutY="405.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="69.0" text="raise" />
<Button fx:id="check" layoutX="251.0" layoutY="405.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="69.0" text="check" />
<Button fx:id="fold" layoutX="473.0" layoutY="405.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="69.0" text="fold" />
<Label layoutX="17.0" layoutY="548.0" prefHeight="42.0" prefWidth="148.0" text="name">
<graphic>
<TextArea fx:id="isAanDeBeurt" prefHeight="42.0" prefWidth="97.0" />
</graphic>
</Label>
<Label layoutX="17.0" layoutY="495.0" text="pot">
<graphic>
<TextArea fx:id="pot" prefHeight="36.0" prefWidth="47.0" />
</graphic>
</Label>
<Label fx:id="label" layoutX="409.0" layoutY="450.0" minHeight="16" minWidth="69" text="stake">
<graphic>
<TextField prefHeight="20.0" prefWidth="91.0" />
</graphic></Label>
<ImageView fx:id="tafel" fitHeight="391.0" fitWidth="556.0">
<image>
<Image url="@../afbeelding/dark_green_colour_background.jpg" />
</image>
</ImageView>
<Pane layoutX="14.0" layoutY="24.0">
<children>
<ImageView fx:id="tafel1" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Label fx:id="label1" layoutX="17.0" layoutY="450.0" minHeight="16" minWidth="69" prefHeight="16.0" prefWidth="119.0" text="credits left">
<graphic>
<TextArea fx:id="creditsLeft" prefHeight="16.0" prefWidth="37.0" />
</graphic>
</Label>
<Pane layoutX="142.0" layoutY="246.0" />
<Pane layoutX="123.0" layoutY="24.0">
<children>
<ImageView fx:id="tafel2" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Pane layoutX="231.0" layoutY="24.0">
<children>
<ImageView fx:id="tafel3" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Pane layoutX="340.0" layoutY="24.0">
<children>
<ImageView fx:id="tafel4" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Pane layoutX="447.0" layoutY="24.0">
<children>
<ImageView fx:id="tafel5" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Pane layoutX="166.0" layoutY="200.0">
<children>
<ImageView fx:id="hand1" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
<Pane layoutX="297.0" layoutY="200.0">
<children>
<ImageView fx:id="hand2" fitHeight="141.0" fitWidth="95.0">
<image>
<Image url="@../afbeelding/back.jpg" />
</image>
</ImageView>
</children>
</Pane>
</children>
你的主播有fx:id“交易”:
FXML注射无法将
按钮
初始化为锚烷
。将fx:id移动到正确的按钮,并给你的主播
一个不同的fx:id。你已经在FXML中将你的主播命名为“交易”,在控制器中将你的按钮命名为“交易”。在初始化期间,映射按名称完成。由于这些对象的类型不同,因此会出现类异常
如果按钮确实是deal,则将id从AnchorPane移动到FXML中的按钮。基于此:
deal.setOnAction(this::deal);
我想这个按钮应该叫deal
换行
<AnchorPane id="AnchorPane" prefHeight="605.0" prefWidth="556.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="poker.FXMLpokerController">
<Button fx:id="deal" layoutX="249.0" layoutY="495.0" mnemonicParsing="false" text="deal" />
这条线呢
<AnchorPane id="AnchorPane" prefHeight="605.0" prefWidth="556.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="poker.FXMLpokerController">
<Button fx:id="deal" layoutX="249.0" layoutY="495.0" mnemonicParsing="false" text="deal" />
应用程序的入口点在哪里?您确定要将您的观点添加到主舞台吗?@sillyfly谢谢您的回复!我添加了主类!我想我已经很接近了!不过我不确定!请看一看;)好的,这似乎是对的。我怀疑发生的是,在try
子句中出现了一个异常,该异常被忽略。您确实应该至少使用printStackTrace
,以便在终端输出中查看是否存在异常。异常可能是因为在setModel
之前调用了fxmlokercontroller
的initialize
,所以model
为空。@slylyfly所以我照你说的做了[catch(IOException ex){ex.printStackTrace();}我希望我做得对;不过我在终端中得到了以下内容“原因:java.lang.IllegalArgumentException:无法将javafx.scene.control.Button field poker.fxmlokercontroller.deal设置为javafx.scene.layout.ancorpane“您知道这意味着什么吗?非常感谢您,您应该在问题中添加stacktrace,并指出行号的位置。如果解决了您的问题,您能将答案标记为正确吗?谢谢。”。
deal.setOnAction(this::deal);
<AnchorPane id="AnchorPane" prefHeight="605.0" prefWidth="556.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="poker.FXMLpokerController">
<Button fx:id="deal" layoutX="249.0" layoutY="495.0" mnemonicParsing="false" text="deal" />