2013-05-26 36 views
1

喜想和大家分享我的Warkaround到已采取了我时间来解决,因为我无法找到任何简单的答案的一个问题。隐藏和显示JavaFX的图表在Swing

我执行的是视其状态的Swing应用程序,无论是显示了JavaFX的图表(火线图)或其他一些内容(对我来说,这是一个JFreeChart的)。 我是添加和删除面板到我的用户界面,但对大多数内容工作正常。

当使用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(新阶段(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){} 
+0

而不是发布您的问题的解决编辑的问题,并删除它,而是发表您的解决方案作为一个答案,并标记它是正确的。请参阅[我能回答自己的问题吗?](http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer - 询问) – jewelsea

+0

一个bug。。我不确定是否允许我这样做。 根据要求更改。 – djpalme

回答

1

我能找到唯一的解决方法是通过一个滥用JSplitPane的(setDivider(0),并设置任一侧作为调用setVisible(假)):示例代码如下。

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

如果您有任何人找到更优雅的解决方案,请随时写下您的答案。 我在这里写了我自己的解决方法,因为我认为,我不是唯一一个有此问题的人。

我希望我可以帮忙。 干杯