스윙 응용 프로그램에서 fxml을 사용하려고합니다. 지금 직면하고있는 문제는 jframe이 나타나지만 javafx 구성 요소가 보이지 않는다는 것입니다. 오류는 없지만 디버깅 할 때 "Thread.exist() 줄 : 사용할 수 없음"오류가 발생합니다. 나는 여기에 전체 코드를 가지고있다 - 당신이 BottomPanel
에 JFXPanel
를 추가하지 않았기 때문에 당신은 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;
}
}
}
이제는 내 코드가 올바르게 작동합니다. 이제는 btn1을 클릭 할 때 Hbox (변수 이름 : scenePane)에서 모든 구성 요소를 제거하려고합니다. btn1이 scenePane 내부에 있기 때문에'getScenePane(). getChildren(). removeAll(); ' 을 사용하여 Hbox의 모든 구성 요소를 제거했지만 작동하지 않습니다. 그러나 btn2와 같은 다른 구성 요소를 제거 할 때 'getScenePane(). getChildren(). remove (getbtn2); ' 그러면 btn2가 제거됩니다. 자신의 하위에서 액션 리스너를 사용하여 scenePane의 모든 구성 요소를 제거하는 방법 – viper
@Viper 이전 질문에 대한 설명 대신 추가 질문 (현재와 관련 없음)이있을 때마다 새 질문을 추가해야합니다. – ItachiUchiha
'getScenePane()'이'Button '이 추가 된'HBox' 참조를 리턴하면'getScenePane(). getChildren(). removeAll();'가 작동해야합니다! – ItachiUchiha