2012-11-29 73 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