2016-08-01 9 views
0

i schrieb eine App mit JavaFX und wollen eine JButton zu einem Fenster in SwingNode hinzufügen dies mein Controller von fxml istHinzufügen swingNode zu JavaFX

public class Controller implements Initializable { 

    @FXML 
    private Pane pane; 

    private static final SwingNode swingNode = new SwingNode(); 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     createSwingContent(swingNode); 
     pane.getChildren().add(swingNode); 
    } 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 

    } 

    private void createSwingContent(final SwingNode swingNode) { 
     SwingUtilities.invokeLater(() -> { 
      JButton jButton = new JButton("Click me!"); 
      jButton.setBounds(0,0,80,50); 

      JPanel panel = new JPanel(); 
      panel.setLayout(null); 
      panel.add(jButton); 

      swingNode.setContent(panel); 

     }); 
    } 
} 

aber nicht, so funktioniert, was falsch ist Whit es? BTW, wenn ich einen Non-SwingNode zu meinem Fenster hinzugefügt hat funktioniert es und zeigt den Button aber in SwingNode Weise funktioniert es nicht!

+0

Macht keinen Unterschied, aber warum ist 'swingNode' statisch? –

Antwort

2

Da Sie alle Layout „von Hand“ verwalten, von setLayout(null) und setBounds(...); auf die Schaltfläche aufrufen, müssen Sie auch die Platte von Hand Größe:

private void createSwingContent(final SwingNode swingNode) { 
    SwingUtilities.invokeLater(() -> { 
     JButton jButton = new JButton("Click me!"); 
     jButton.setBounds(0,0,80,50); 

     JPanel panel = new JPanel(); 
     panel.setLayout(null); 
     panel.add(jButton); 

     panel.setSize(90, 60); 

     swingNode.setContent(panel); 

    }); 
} 

Alternativ können Sie ein Layout-Manager (zB , nur der Standard ein, wie abgebildet):

private void createSwingContent(final SwingNode swingNode) { 
    SwingUtilities.invokeLater(() -> { 
     JButton jButton = new JButton("Click me!"); 
     // jButton.setBounds(0,0,80,50); 

     jButton.setPreferredSize(new Dimension(80, 50)); 

     JPanel panel = new JPanel(); 
     // panel.setLayout(null); 
     panel.add(jButton); 

     swingNode.setContent(panel); 

    }); 
} 

Mit Ihrem aktuellen Code, wird der Button zum JPanel hinzugefügt, aber da die JPanel Null Breite und Höhe hat, so auch die SwingNode und Sie können also den Knopf nicht sehen.

Nebenbei ist es ein Fehler, die swingNode statisch zu machen. Wenn Sie die FXML mehr als einmal in die Anwendung laden würden, hätten Sie denselben Knoten an zwei verschiedenen Stellen im Szenegraph, was nicht erlaubt ist.