2015-09-09 95 views
1

mxgraph我需要做的是在一個JavaFX FXML文件生成的圖形桌面應用程序。我在eclipse中使用mxGraph庫來構建圖形和場景生成器來編輯FXML文件,但是我無法將圖形顯示在FXML文件中,它只在我使用JFrame時才起作用。 當我這樣運行:整合內部的JavaFX的FXML文件

public class mxgraphteste extends JFrame{ 

public mxgraphteste(){ 
    mxGraph grafo = new mxGraph(); 
    Object parent = grafo.getDefaultParent(); 

    Object v1 = grafo.insertVertex(parent, null, "Brazil", 100, 100, 50, 40); 
    Object v2 = grafo.insertVertex(parent, null, "Soccer", 240, 150, 50, 40); 
    Object a1 = grafo.insertEdge(parent, null, "loves", v1, v2); 

    mxGraphComponent graphComponent = new mxGraphComponent(grafo); 
    getContentPane().add(graphComponent); 
} 

public static void main(String[] args) { 
    mxgraphteste frame = new mxgraphteste(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 320); 
    frame.setVisible(true); 
} 

} 

它的工作原理。 但我需要的圖形裏面去了這一點:

<AnchorPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.TelaPrincipalController"> 
    <children> 
     <BorderPane fx:id="borderPane" layoutX="446.0" layoutY="141.0" prefHeight="600.0" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
      <right> 
       <Pane fx:id="paineDireita" prefHeight="491.0" prefWidth="126.0" BorderPane.alignment="CENTER"> 
        <children> 
         <Button fx:id="buttonNo" layoutX="37.0" layoutY="179.0" mnemonicParsing="false" onAction="#selecionarNo" text="Nó" /> 
         <Button fx:id="buttonAresta" layoutX="28.0" layoutY="259.0" mnemonicParsing="false" text="Aresta" /> 
        </children> 
       </Pane> 
      </right> 
      <center> 
       <Pane fx:id="paineCentro" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> **~~~~~~~~~~~~~~~~ I NEED IT GO INSIDE THIS PANE ~~~~~~~~~~~~** 
      </center> 
     </BorderPane> 
    </children> 
</AnchorPane> 

我已經使用jdk8。我試着按照Oracle's tutorial for Swing Content in JavaFX Applications,但我無法將圖形轉換爲SwingNode。我使用JFXPanel爲使用JavaFX的Swing應用程序找到了解決方案,但它沒有用於相反的工作。 有誰知道我做錯了什麼,或者我該如何解決? 謝謝!

+0

搖擺GUI對象應當被構造和操作的_only_ [事件調度線程]上(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html),對於[示例](HTTP: //stackoverflow.com/a/32396344/230513)。 – trashgod

+0

嘿加布里拉我正在一個類似的項目,寫信給我; [email protected]我可以幫你 – Gonza

回答

1

我不知道mxGraph,所以我只是要假設你的代碼是針對部分正確。

要嵌入Swing組件到JavaFX,你需要用它在SwingNode。正如在註釋中指出的那樣,您需要在AWT事件調度線程上創建swing內容。由於在FX應用程序線程的運行FXMLLoader,你不能直接在文件FXML創建mxGraph,並會做初始化的一部分,你的控制器類。

所以,你可以做FXML如下:

<AnchorPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.TelaPrincipalController"> 
    <children> 
     <BorderPane fx:id="borderPane" layoutX="446.0" layoutY="141.0" prefHeight="600.0" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
      <right> 
       <Pane fx:id="paineDireita" prefHeight="491.0" prefWidth="126.0" BorderPane.alignment="CENTER"> 
        <children> 
         <Button fx:id="buttonNo" layoutX="37.0" layoutY="179.0" mnemonicParsing="false" onAction="#selecionarNo" text="Nó" /> 
         <Button fx:id="buttonAresta" layoutX="28.0" layoutY="259.0" mnemonicParsing="false" text="Aresta" /> 
        </children> 
       </Pane> 
      </right> 
      <center> 
       <Pane fx:id="paineCentro" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" > 
        <SwingNode fx:id="swingComponentWrapper"/> 
       </Pane> 
      </center> 
     </BorderPane> 
    </children> 
</AnchorPane> 

現在在你的控制器,你可以這樣做:

public class TelaPrincipalController { 

    @FXML 
    private SwingNode swingComponentWrapper ; 

    public void initialize() { 
     SwingUtilities.invokeLater(this::createMxGraph); 
    } 

    private void createMxGraph() { 
     mxGraph grafo = new mxGraph(); 
     Object parent = grafo.getDefaultParent(); 

     Object v1 = grafo.insertVertex(parent, null, "Brazil", 100, 100, 50, 40); 
     Object v2 = grafo.insertVertex(parent, null, "Soccer", 240, 150, 50, 40); 
     Object a1 = grafo.insertEdge(parent, null, "loves", v1, v2); 

     mxGraphComponent graphComponent = new mxGraphComponent(grafo); 

     swingComponentWrapper.setContent(graphComponent); 
    } 

    @FXML 
    private void selecionarNo() { 
     // ... 
    } 

    // etc etc... 
} 

注意SwingNode只有輕量級組件協同工作(也就是那些畫由Swing管理);如果mxGraph使用重量級組件,這可能無法正常工作。

+0

它的工作!非常感謝!!! –

+0

您使用的是哪個版本的jgraphx?你還可以發佈一個完整的工作示例來更好地理解解決方案嗎? –