使用图形视图和scenebuilder运行javaFX应用程序时显示空窗口

使用图形视图和scenebuilder运行javaFX应用程序时显示空窗口,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,我目前正在写一个扑克游戏作为期末考试的作业。我必须使用一个组合视图:一个包含实际代码和Scenebuilder的类。我做了我学到的一切,模型工作得很好。我是新来的,所以这一定很容易解决!教授们想让我们熟悉Scenebuilder,但他们没有给出太多解释 如您所见,我使用了一个名为pokerView的类,在该类中,我加载了每张卡的图像。在开始的时候,我使用了一个奇怪的forloop来自动生成图像的名称,我把它打印出来,url就可以了 我还使用scenebuilder。它有自己的控制器/视图类,即F

我目前正在写一个扑克游戏作为期末考试的作业。我必须使用一个组合视图:一个包含实际代码和Scenebuilder的类。我做了我学到的一切,模型工作得很好。我是新来的,所以这一定很容易解决!教授们想让我们熟悉Scenebuilder,但他们没有给出太多解释

如您所见,我使用了一个名为pokerView的类,在该类中,我加载了每张卡的图像。在开始的时候,我使用了一个奇怪的forloop来自动生成图像的名称,我把它打印出来,url就可以了

我还使用scenebuilder。它有自己的控制器/视图类,即FXMLPoker控制器

为了将两者结合起来,我使用了“超级”视图

有趣的是java没有给我任何错误

我真的需要一个答案。如果窗口显示为空,则无法显示应用程序

所以终端在使用printstacktrace时会给出以下几行

    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" />