こんにちは、簡単な答えが見つからなかったため、解決するのに何時間もかかった問題の回避策を共有したいと思います。
ステータスに応じて、JavaFX Chart (ライブ折れ線グラフ) またはその他のコンテンツ (私の場合は JFreeChart) を表示する Swing アプリケーションを実装しています。ただし、ほとんどのコンテンツで正常に動作する UI にパネルを追加および削除しました。
JavaFX を使用している場合、コンテンツを表示してから非表示にすると、コンテンツが表示されません。
以下の動作しないサンプル コードを参照してください。
CustomFXPanel pn1 = new CustomFXPanel(); //JPanel containing JavaFX Chart
CustomPanel pn2 = new CustomPanel(); //Extends JPanel
JPanel pnContent; //PlaceHolder for either Panel
/**
* Constructor
*/
public MyJFrame(){
init(); //Set up JFrame Size, title etc.
setLayout(new GridLayout(1,1)); //Show the Content all across the Frame
pnContent = pn1;
add(pnContent);
}
/**
* Changes Mode of Application
* @param showFX: True = show fxChart, False = show other Panel
*/
public void changePanel(boolean showFX){
if(showFX){ //Show FX Chart
if(!pnContent.equals(pn1)){
remove(pnContent);
pnContent = pn1;
add(pnContent);
}
}else{ //Show other Panel
if(!pnContent.equals(pn2)){
remove(pnContent);
pnContent = pn2;
add(pnContent);
}
}
}
問題: 起動時に正常に表示されます。ただし、pn2 に変更してから pn1 に戻すと、pn1 内の JFXPanel が表示されません。
pn1内でmyFXPanel.setStage(new Stage(myJFXChart))を再呼び出しすることで機能しました。ただし、これは常に IllegalArgumentsException をスローし、...「すでに別のシーンのルートとして設定されています」。-うまくいきましたが、例外が飛び交うのは醜く悪い習慣だと思います。
厄介なことに、この例外を処理しようとすると、パネルが再び表示されなくなりました。これも:
JFXPanel myFXPanel = new JFXPanel();
LineChart<Number, Number> chart;
....
//Inside reload method
//With parts inside then outside Platform.runLater(new Runnable()) {...}
myFXPanel.invalidate();
myFXPanel.removeAll();
try{
setStage(newStage(chart));
}catch(Exception ex){}