2017-02-27 101 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,從一些教程或其他教程中複製。我刪除了修飾符,應用程序現在可以工作。如果任何人通過關心解釋爲什麼會出現這種情況(我不知道,也沒有時間研究,截止日期即將到來),這個答案的價值將顯着上升。

相關問題