2016-08-01 3 views
0

i a écrit une application avec JavaFX et que vous voulez ajouter un JButton à un volet dans SwingNode c'est mon contrôleur de FXMLAjout swingNode à 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); 

     }); 
    } 
} 

mais il ne fonctionne pas, alors quel est Whit mal il? BTW, quand j'ai ajouté un non-swingNode à mon volet, cela fonctionne et montre le bouton, mais de façon swingNode, il ne fonctionne pas!

+0

Cela ne fait peut-être aucune différence, mais pourquoi 'swingNode' est-il statique? –

Répondre

2

Puisque vous gérez toute la mise en page « à la main », en appelant setLayout(null) et setBounds(...); sur le bouton, vous avez besoin de la taille du panneau à la main aussi:

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); 

    }); 
} 

Vous pouvez également utiliser un gestionnaire de mise en page (par exemple , juste par défaut, comme indiqué ici):

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); 

    }); 
} 

Avec votre code actuel, le bouton est ajouté à la JPanel, mais étant donné que la JPanel a une largeur et une hauteur nulle, de sorte que le fait SwingNode, et donc vous ne pouvez pas voir le bouton. En outre, c'est une erreur de rendre statique la swingNode. Si vous chargiez le FXML plus d'une fois dans l'application, vous auriez le même nœud à deux endroits différents dans le graphe de scène, ce qui n'est pas autorisé.