2014-09-14 2 views
3

스윙 응용 프로그램에서 fxml을 사용하려고합니다. 지금 직면하고있는 문제는 jframe이 나타나지만 javafx 구성 요소가 보이지 않는다는 것입니다. 오류는 없지만 디버깅 할 때 "Thread.exist() 줄 : 사용할 수 없음"오류가 발생합니다. 나는 여기에 전체 코드를 가지고있다 - 당신이 BottomPanelJFXPanel를 추가하지 않았기 때문에 당신은 JFXPanel을 볼 수Thread.exit() 줄 : jfxpanel을 사용하여 javafx를 스윙에 통합 할 때 오류가 발생했습니다.

package nonResponsiveButtons; 

import java.awt.Color; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.Pane; 
import javafx.application.Platform; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class NonResponsiveButtons extends JFrame { 

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

    public NonResponsiveButtons(){ 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       try{ 
       new JFXPanel(); 
       BottomPanel bottomPanel = new BottomPanel(); 
       add(bottomPanel); 
       } 
       catch(Exception e){ 
        System.out.println("Error in swing utilities thread :" + e.getMessage()); 
       } 

      } 
     }); 

     this.setSize(600, 600); 
     getContentPane().setLayout(null); 
     add(jPanel());  


     setVisible(true); 
    } 

    private JPanel jPanel(){ 
     JPanel panel = new JPanel(); 
     panel.setSize(600,500); 
     panel.setBackground(Color.blue); 
     return panel; 
    } 

    private class BottomPanel extends JPanel{ 
     private JFXPanel jfxPanel; 
     private Pane scenePane; 
     private Button btn1; 
     private Button btn2; 
     private Button btn3; 

     private BottomPanel(){ 
      setSize(600, 100); 
      setLocation(0, 500); 
      setLayout(null); 



      Platform.runLater(new Runnable(){ 
       @Override 
       public void run(){ 
        getScenePane().getChildren().addAll(getBtn1(),getBtn2(),getBtn3()); 
        getjfxPanel().setScene(new Scene(getScenePane())); 

       } 

      }); 
     } 

     private JFXPanel getjfxPanel(){ 
      if(jfxPanel == null){ 
       jfxPanel = new JFXPanel(); 
       jfxPanel.setSize(600,200); 
      } 
      return jfxPanel; 
     } 

     private Pane getScenePane(){ 
      if(scenePane == null){ 
       scenePane = new Pane(); 
       scenePane.setStyle("-fx-background-color:#666666"); 
      } 
      return scenePane; 
     } 

     /* 
     * using getters will avoid :- 
     * 1. null pointer exceptions 
     * 2. standard coding format 
     * 3. makex programming felxible 
     */ 
     private Button getBtn1(){ 
      if(btn1 == null){ 
       btn1 = new Button(); 
       btn1.setPrefSize(100, 50); 
       btn1.setLayoutX(80); 
      } 
      return btn1; 
     } 
     private Button getBtn2(){ 
      if(btn2 == null){ 
       btn2 = new Button(); 
       btn2.setPrefSize(100, 50); 
       btn2.setLayoutX(80); 
      } 
      return btn2; 
     } 
     private Button getBtn3(){ 
      if(btn3 == null){ 
       btn3 = new Button(); 
       btn3.setPrefSize(100, 50); 
       btn3.setLayoutX(80); 
      } 
      return btn3; 
     } 
    } 


} 

답변

0

. BottomPanel의 생성자 내부, 그냥 다음과 같을 것입니다 add(getjfxPanel());

귀하의 생성자를 추가

private BottomPanel(){ 
    setSize(600, 100); 
    setLocation(0, 500); 
    setLayout(null); 

    Platform.runLater(new Runnable(){ 
     @Override 
     public void run(){ 
      getScenePane().getChildren().addAll(getBtn1(),getBtn2(),getBtn3()); 
      getjfxPanel().setScene(new Scene(getScenePane())); 
     } 
    }); 
    add(getjfxPanel()); 
} 

참고 :를이 방금 한 Button 볼 수있을 것이다 추가 한 후. 코드에 아무런 문제가 없습니다. 버튼을 Pane에 추가하고 있습니다. 이것이 서로 위에있는 이유입니다. PaneHBox으로 바꾸면 HBox이 원하는 순서대로 컨트롤을 정렬하기 때문에 모든 버튼을 볼 수 있습니다.

+0

이제는 내 코드가 올바르게 작동합니다. 이제는 btn1을 클릭 할 때 Hbox (변수 이름 : scenePane)에서 모든 구성 요소를 제거하려고합니다. btn1이 scenePane 내부에 있기 때문에'getScenePane(). getChildren(). removeAll(); ' 을 사용하여 Hbox의 모든 구성 요소를 제거했지만 작동하지 않습니다. 그러나 btn2와 같은 다른 구성 요소를 제거 할 때 'getScenePane(). getChildren(). remove (getbtn2); ' 그러면 btn2가 제거됩니다. 자신의 하위에서 액션 리스너를 사용하여 scenePane의 모든 구성 요소를 제거하는 방법 – viper

+0

@Viper 이전 질문에 대한 설명 대신 추가 질문 (현재와 관련 없음)이있을 때마다 새 질문을 추가해야합니다. – ItachiUchiha

+0

'getScenePane()'이'Button '이 추가 된'HBox' 참조를 리턴하면'getScenePane(). getChildren(). removeAll();'가 작동해야합니다! – ItachiUchiha

관련 문제