2010-10-22 85 views
4

我有一個AWT畫布,我無法將其轉換爲Swing組件(它來自VTK)。我希望在JSplitPane中顯示一些這些畫布。我讀過關於在Java中混合重量和輕量級組件的知識,並且知道這是一個令人頭疼的問題,但我沒有選擇。如果我將AWT畫布包裝在JPanel中,然後將它放在分割窗格上,那麼分割窗格根本不起作用。但是,如果我將AWT畫布放在JPanel內部,然後放入JScrollPane內部,然後將JSplitPane上的那些滾動窗格放在分割窗格中,但AWT畫布組件不能正確調整大小。我迷失了關​​於如何在JSplitPane的分隔符被移動時讓AWT畫布組件正確調整大小。我可以在那個時候捕捉分隔線移動操作並在AWT畫布上操作,但我不知道該怎麼做。我試着調用invalidate()然後驗證()然後重繪(),但沒有奏效。將JSplitPane與AWT組件一起使用

任何想法?

這裏的問題

import javax.swing.*; 
import java.awt.*; 

public class SwingAWTError { 
    public static void main(String[] args) { 
     Canvas leftCanvas = new Canvas(); 
     Canvas rightCanvas = new Canvas(); 
     leftCanvas.setBackground(Color.RED); 
     rightCanvas.setBackground(Color.BLUE); 

     JPanel leftPanel = new JPanel(); 
     JPanel rightPanel = new JPanel(); 
     leftPanel.setLayout(new BorderLayout()); 
     rightPanel.setLayout(new BorderLayout()); 
     leftPanel.add(leftCanvas, BorderLayout.CENTER); 
     rightPanel.add(rightCanvas, BorderLayout.CENTER); 

     JScrollPane leftScroll = new JScrollPane(); 
     JScrollPane rightScroll = new JScrollPane(); 
     leftScroll.getViewport().add(leftPanel); 
     rightScroll.getViewport().add(rightPanel); 

     JSplitPane split = new JSplitPane(); 
     split.setLeftComponent(leftScroll); 
     split.setRightComponent(rightScroll); 
     split.setDividerLocation(400); 

     JFrame frame = new JFrame(); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(split, BorderLayout.CENTER); 
     frame.setSize(800, 800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

你的意思是JScrollPane而不是JScrollBar? – 2010-10-22 17:54:41

+0

我願意。現在已修好。 – Jon 2010-10-22 17:59:58

+0

也許SSCCE(http://sscce.org)會幫助我們看到問題。您可以創建一個簡單的Canvas,而無需使用VTK來展示問題。您也可以升級到現在支持混合AWT組件的JDK 1.6.17(?)或JDK 1.7。 – camickr 2010-10-22 21:32:14

回答

4

這是一個骯髒的方式,但是這將解決這個問題:

當你調用pack()不調整窗口大小,沒有太大的反應。因此,當您第一次調整窗口大小並調用pack()時,您的組件會被正確繪製。這意味着你可以把你的分頻器這個骯髒的方法移動監聽方法:

frame.setPreferredSize(frame.getSize()); // store the current size to restore it after packing. 
frame.setSize(frame.getWidth() + 1, frame.getHeight()); // resize it!! 
frame.pack(); 

我不知道它到底是什麼,但它是在Java中一個奇怪的水煤漿...
希望這有助於直到你」我發現了一個更好的解決方案...

+0

這很髒,但它適用於我。謝謝。 – Jon 2010-10-27 15:29:11

+0

@Jon:不客氣。 – 2010-10-28 16:09:57

2

您是那種運氣在這裏的一個例子。有陽光/ oracle的網站上這是一個相當不錯的文章: http://java.sun.com/products/jfc/tsc/articles/mixing/

本質上,它歸結爲這一準則(從該鏈接取,z排序標題下):

不要混用輕量級(Swing)和 重量級(AWT)組件在 容器中,其中輕量級 組件預計會與重量級 重疊。

編輯:我一直在瀏覽該網站,跨越另一個鏈接來了,它會出現這種情況略有改善:http://java.sun.com/developer/technicalArticles/GUI/mixing_components/但是我覺得你的情況是那些在限制部分底部列出的一個:

限制

有幾種情況不支持:

* Non-opaque lightweight components that have translucent 

像素( 0 < alpha < 255)不支持 。如果部分半透明的輕量級組件與 重磅組件重疊,則重量級組件 將不會透視。

* Embedded heavyweight components must belong to the process that 

創建了框架或小程序。 重要組件在應用程序(或小應用程序)的主進程 內必須具有 有效對等項。

* Advanced Swing key events, such as those events maintained in an 

的InputMap,可能無法正常工作 其中被混合輕量級和重量級 組件。有 沒有已知的解決方法。

+0

顯然,這不是我想聽到的。你列出的三種情況中哪一種屬於我?另外,有沒有在未來的Java版本中解決這些問題的討論? – Jon 2010-10-26 16:17:41

+0

對不起,我只是在猜測。多年來我一直不需要使用Swing,這就是爲什麼我甚至不知道他們對某些案例有修復的原因。 – Goibniu 2010-10-26 18:14:06

相關問題