2016-08-01 89 views
0

我寫一個應用程序使用JavaFX和想添加一個JButton的窗格中SwingNode 這是我FXML添加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); 

     }); 
    } 
} 

,但它不能正常工作的控制器,所以什麼是錯的白衣呢? 順便說一下,當我添加一個non-swingNode到我的窗格它的作品,並顯示按鈕,但 在swingNode方式它不工作!

+0

可能沒有什麼區別,但爲什麼'swingNode'是靜態的? –

回答

2

既然你是管理所有佈局「手動」,通過按鈕呼叫setLayout(null)setBounds(...);,你需要的大小用手面板太:

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

    }); 
} 

另外,使用佈局管理器(例如, ,只是默認的,如下圖所示):

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

    }); 
} 

根據您目前的代碼,該按鈕被添加到JPanel,但是由於JPanel具有零寬度和高度,所以做了SwingNode,和所以你看不到按鈕。

順便說一下,將swingNode設爲靜態是一個錯誤。如果您要在應用程序中多次加載FXML,那麼在場景圖中的兩個不同位置將會有相同的節點,這是不允許的。