2017-02-27 368 views
0

我试图编写一个简单的Java应用程序,用于通过拖动大门和连接来修改和可视化逻辑电路。我使用SceneBuilder将界面放在一起。现在,我坚持让可用的基本逻辑门在其正确的栏中显示并响应与之交互。更准确地说,我试图让一个门只显示一些控制台输出,以确认GUI逻辑连接正在工作。FXML:在SceneBuilder中显示ImageView,但在实际应用程序中不显示

我遇到的最大问题是,门的ImageViews,可能还有一些其他FXML元素,由于某种原因拒绝显示在实际编译的应用程序中,即使它们在SceneBuilder中正确工作并在其“预览”功能。

我不得不做一些实验,将它们包装在各种其他FXML元素中,这些元素我都不太明白,因为显然ImageWiew没有onDragDetected()方法,尽管它的文本输入字段在SceneBuilder中可用。在第一张照片上,可以直接从SceneBuilder中直观地看到预期的工作中应用布局。与实际运行的应用程序的第二个比较。

As seen in SceneBuilder GUI of the running app

可能相关的代码:

Main.java

package main; 

    import javafx.application.Application; 
    import javafx.fxml.FXMLLoader; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 
    import javafx.stage.Stage; 

    public class Main extends Application { 

     @Override 
     public void start(Stage primaryStage) throws Exception{ 
      Parent root = FXMLLoader.load(getClass().getResource("RootLayout.fxml")); 
      primaryStage.setTitle("Hello World"); 
      primaryStage.setScene(new Scene(root, 640, 450)); 
      primaryStage.show(); 
     } 

     public static void main(String[] args) throws Exception { 
      launch(args); 
     } 
    } 

TheCircuitController.java

package Gates; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.AnchorPane; 

import java.net.URL; 
import java.util.ArrayList; 
import java.util.ResourceBundle; 


/** 
* The class for holding all the information about gates, connections, and in and out pins in the current circuit 
*/ 
public class TheCircuitController implements Initializable{ 

    @FXML 
    private AnchorPane anchorPaneNAND; 

    //TODO temporarily public, make private later 
    public ArrayList<CircuitElement> allCircuitElements= new ArrayList<CircuitElement>(); 
    public ArrayList<Pin> theCircuitInputPins = new ArrayList<Pin>(); 
    public ArrayList<Pin> theCircuitOutputPins = new ArrayList<Pin>(); 
    ArrayList<Connection> allCircuitConnections = new ArrayList<Connection>(); 
    public ArrayList<Pin> allCircuitGateInputPins = new ArrayList<Pin>(); 
    public ArrayList<Pin> allCircuitGateOutputPins = new ArrayList<Pin>(); 
    public ArrayList<Gate> allCircuitGates = new ArrayList<Gate>(); 

    private InbuiltGateType currentDragGateType; 

    @Override 
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) { 
     // initialize your logic here: all @FXML variables will have been injected 
     anchorPaneNAND.setOnDragDetected(this::handleDragDetectedNAND); 
    } 

    @FXML 
    private void handleDragDetectedNAND(MouseEvent mouseEvent) { 
     System.out.println("drag detected nand!"); 
    } 

//other stuff of the class, unrelated to FXML 
} 

RootLayout.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.geometry.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Gates.TheCircuitController"> 
    <children> 
     <MenuBar prefHeight="27.0" prefWidth="562.0"> 
     <menus> 
      <Menu mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
      </items> 
      </Menu> 
     </menus> 
     </MenuBar> 
     <SplitPane dividerPositions="0.2413793103448276" prefHeight="402.0" prefWidth="640.0"> 
     <items> 
      <ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="400.0" prefWidth="122.0"> 
       <content> 
        <VBox prefHeight="400.0" prefWidth="208.0" spacing="10.0"> 
        <children> 
         <AnchorPane fx:id="anchorPaneNAND" onDragDetected="#handleDragDetectedNAND"> 
          <children> 
           <ImageView> 
           <image> 
            <Image url="@../../resources/100px-NAND_ANSI.svg.png" /> 
           </image> 
           </ImageView> 
          </children> 
         </AnchorPane> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/100px-NOT_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/100px-AND_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/OR_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/100px-NOR_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/100px-XOR_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
         <ImageView> 
          <image> 
           <Image url="@../../resources/100px-XNOR_ANSI.svg.png" /> 
          </image> 
         </ImageView> 
        </children> 
        <padding> 
         <Insets left="20.0" right="20.0" /> 
        </padding></VBox> 
       </content></ScrollPane> 
      <ScrollPane prefHeight="400.0" prefWidth="406.0" /> 
     </items> 
     </SplitPane> 
    </children> 
</VBox> 

因此,我需要知道:

为什么这些门(或至少一个)按预期不显示? ScrollPane有什么用,它为什么不在SceneBuilder中显示它的滑块?我需要什么东西来设置不同或摆动,才能让这些大门正确显示并互动?

+0

检查场景图是否已正确构建的最佳方法是使用http://fxexperience.com/scenic-view/。如果ScrollPane和VBox在那里检查高度值。这也取决于你如何构建你的应用程序。它可能发生在建筑后图像不在正确的地方 – Westranger

回答

0

经过一些随机的排除故障,我找到了一个解决方案。我想看看View->Show Sample Controller Skeleton。在那里,我注意到handleDragDetectedNAND()方法没有任何修饰符,而我的private,从一些教程或其他教程中复制。我删除了修饰符,应用程序现在可以工作。如果任何人通过关心解释为什么会出现这种情况(我不知道,也没有时间研究,截止日期即将到来),这个答案的价值将显着上升。

相关问题