1

こんにちは、簡単な答えが見つからなかったため、解決するのに何時間もかかった問題の回避策を共有したいと思います。

ステータスに応じて、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){}
4

1 に答える 1

1

私が見つけた唯一の回避策は、JSplitPane を悪用することです (setDivider(0) を設定し、いずれかの側を setVisible(false) に設定します)。サンプル コードは次のとおりです。

CustomFXPanel pn1 = new CustomFXPanel(); //JPanel containing JavaFX Chart
CustomPanel pn2 = new CustomPanel();     //Extends JPanel
JSplitPane spContent;
…
/**
 * Constructor
 */
public MyJFrame(){
    init(); //Set up JFrame Size, title etc.
    spContent.setDividerSize(0);        //Hide the Divider
    spContent.setLeftComponent(pn1);    
    spContent.setLeftComponent(pn2);
    pn1.setVisible(true);               //By default show pn1
    pn2.setVisible(false);              //Hide this Panel. JSplitPane will adjust itself (either left or right will take up all space).

    setLayout(new GridLayout(1,1)); //Show the Content all across the Frame
    add(spContent);
}    

/**
 * Changes Mode of Application
 * @param showFX: True = show fxChart, False = show other Panel
 */
public void changePanel(boolean showFX){
    if(showFX){  //Show FX Panel
        pn1.setVisible(true);    //spContent will adjust itself
        pn2.setVisible(false);
    }else{  //Show normal Panel
        pn1.setVisible(false);
        pn2.setVisible(true);
    }
}

これに対するよりエレガントな解決策を見つけた方がいらっしゃいましたら、お気軽に回答を書き留めてください。この問題を抱えている/持っていたのは私だけではないと思うので、ここに独自の回避策を書きました。

お役に立てれば幸いです。乾杯

于 2013-05-28T11:23:57.383 に答える