2017-01-13 10 views
0

JavaFX 응용 프로그램에 Swing으로 작성된 하나의 구성 요소 (JPanel)를 넣으려고합니다. 이 웹 사이트에 표시된 코드를 사용하여 관리했습니다. click hereFXML 파일 및 장면 작성기로 JavaFX 응용 프로그램에 Swing 내용 포함

그러나 FXML 파일과 장면 작성기를 사용하여 응용 프로그램을 구축하고 있습니다.

scene builder

을하지만 불행하게도, 나는 그것을 할 관리하지 않았다 : 나는 (이 아래 그림에 보여처럼)를 SwingNode와 창 용기 내 스윙 구성 요소를 넣어하려고했다. 나는 사방을보고 있었고 나는 나의 경우에 유용한 것을 찾지 못했습니다.

저는 JavaFX를 처음 접했고 장면 제작자를 사용하는 것이 중요합니다. 그게 가능한 일 이라니?

내 시험 :

Main.JAVA

package application; 


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("sample.fxml")); 
     primaryStage.setTitle("Letter Recognition with Neural Networks"); 
     primaryStage.setScene(new Scene(root, 1150, 650)); 
     primaryStage.setResizable(false); 
     primaryStage.show(); 
    } 

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

} 

Controller.JAVA

package application; 

import application.gui.DrawingPanel; 
import javafx.embed.swing.SwingNode; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 

import javax.swing.*; 
import java.net.URL; 
import java.util.ResourceBundle; 

public class Controller implements Initializable { 

    @FXML 
    private Pane pane; 

    @FXML 
    private SwingNode swingNode; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     swingNode = new SwingNode(); 
     pane = new Pane(); 

     createAndSetSwingDrawingPanel(swingNode); 
     pane.getChildren().add(swingNode); 
    } 

    public void createAndSetSwingDrawingPanel(final SwingNode swingNode) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       swingNode.setContent(new DrawingPanel(400, 400 , 20)); 
      } 
     }); 
    } 
} 

FXML 파일 :

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

<?import javafx.embed.swing.SwingNode?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.Pane?> 
<?import javafx.scene.layout.RowConstraints?> 
<?import javafx.scene.text.Font?> 

<GridPane gridLinesVisible="true" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.60"> 
    <columnConstraints> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
    </columnConstraints> 
    <rowConstraints> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
    </rowConstraints> 
    <children> 
     <Pane fx:id="pane" prefHeight="200.0" prefWidth="200.0"> 
     <children> 
      <SwingNode fx:id="swingNode" /> 
     </children> 
     </Pane> 
     <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="80.0" text="Click" GridPane.rowIndex="2"> 
     <font> 
      <Font size="18.0" /> 
     </font> 
     </Button> 
    </children> 
</GridPane> 
+0

FXML 파일을 게시 할 수 있습니까? '@ FXML' 주석이 달린 필드를 초기화하는 것은 항상 실수입니다. –

+0

좋아요, 게시했습니다. 어쩌면, 내가 JavaFX에 익숙하지 않고 때로는 내가 뭘하는지 모르겠다. :) –

답변

1

FXML에서 <Pane> 요소 안에 <children> 요소 안에 <SwingNode> 요소가 있으므로 스윙 노드가 이미 창 자식입니다. 따라서 컨트롤러의 하위 노드에 두 번째 노드를 추가해서는 안됩니다.

또한

FXMLLoader는 FXML 파일에 대응하는 생성 된 값을 상기 제어기에서 paneswingNode 필드 (즉, 그들 @FXML 주석의 요점이다)를 초기화 할 것이다. @FXML이라는 주석이 달린 필드를 초기화하는 것은 항상 실수입니다.

그래서 당신이 initialize 방법에 필요한 모든 마지막

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    createAndSetSwingDrawingPanel(swingNode); 
} 

, 당신은 당신의 FXML 파일에서 <fx:controller> 속성이 누락 될 것으로 보인다. 씬 빌더에서 맨 왼쪽의 "컨트롤러"패널을 확장하고 "컨트롤러 클래스"필드에 application.Controller을 입력하십시오.

+0

Yeees :) 이제 작동합니다. 실제로 속성이 설정되었습니다. 나는 그것이 왜 사라 졌는지 모른다. 정말 고맙습니다 :) –