2012-11-29 39 views
2

我正在使用Java3D和Jmol(它是3D中化学结构的查看器)的项目。我必须创建能够在Java3D和Jmol表示结构之间切换的视图。交换JPanel内容时闪烁

我已经设法做到了这一点,但是当我将JPanel与JmolPanel和Canvas3D交换在其中时,我得到了交换区域的闪烁。

我只是换板做:

public static void changeView(JPanel c) { 
    c.removeAll(); 
    if (var) { 
     c.add(canvas); 
    } else { 
     c.add(jmolPanel); 
    } 
    c.revalidate(); 
    var = !var; 
} 

创建与按钮用于交换板架可以在这里找到的代码示例:http://pastebin.com/3F2gKBgb

要运行这个例子,你需要Jmol的。 jar(可以在这里找到http://jmol.sourceforge.net/download/)和Java3D(http://java3d.java.net/binary-builds.html)

我试着在JPanels中设置双缓冲,但它没有帮助。你有什么想法如何解决闪烁的问题?

+2

看来我还需要一台Windows PC来运行该代码(我的Mac没有C:/驱动器)。这就是说,看看'CardLayout'类设计用于在不同视图之间切换 – Robin

+0

@Robin它只是j3dcore-ogl.dll文件(Java3D安装)的路径。如果你将它交换到Mac路径,它可能会工作(或者你根本不需要这个 - 也许这只是我的配置问题)。 我按照你的建议改变了布局,但我仍然闪烁。代码现在改变我的面板的内容是这样的(我不知道,如果你可以用它做更多的事情): \t'公共静态无效changeView(JPanel中C){ \t \t CardLayout CL =(CardLayout)c.getLayout ();如果(var){ } \t \t if(var)cl.show(c,“canvas”); (c,“jmol”);其他{ \t}其他{ \t \t} \t \t var =!var; \t}' – lasjak

+0

如果我记得正确(它开始一段时间),3D画布往往是沉重的重量组件。闪烁可能是批量重和轻重量组件之间的转换,如果是这样,可能没有任何人可以做。确保您在I内切换组件。EDT – MadProgrammer

回答

0

如果通过闪烁意味着它正在重新绘制,而您正在删除,然后添加子面板,然后我会尝试停止重绘,做所有的交换,然后启用重新绘制父面板。

可能是 c.setVisible(false); <your swapping code>; c.setVisible(true); 会有帮助吗?

或创建一个子面板sc,您将使其不可见,您将添加可交换组件,以便始终可以看到父面板。这可能是一个双缓冲问题,应该已经解决了您的问题,但值得一试。

+0

setVisible()不幸没有帮助。子面板到底意味着什么?现在,我将viewPanel(父类面板的种类 - 它是changeView()中的'c'面板)添加到内容窗格,并且此viewPanel始终可见。 – lasjak