2010-10-22 1 views
4

У меня есть AWT-холст, который я не могу преобразовать в компонент Swing (он исходит от VTK). Я хочу отобразить некоторые из этих полотен внутри JSplitPane. Я читал о смешивании тяжелых и легких компонентов на Java и знаю, что это боль в заднице, но у меня нет выбора. Если я обернуваю холст AWT внутри JPanel, а затем поставлю его на панель разделения, панель разделения вообще не работает. Однако, если я поместил AWT-холст внутри JPanel, а затем внутри JScrollPane, а затем эти панели прокрутки на JSplitPane, панель разделения работает, но компоненты холста AWT не изменяются правильно. Я потерял информацию о том, как заставить компоненты холста AWT правильно изменять размер, когда разделитель JSplitPane перемещается. Я могу поймать операцию перемещения делителя и работать на холстах AWT в то время, но я не знаю, что делать. Я попытался вызвать invalidate(), затем validate(), а затем repaint(), но это не сработало.Использование 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? –

+0

я. Теперь это исправлено. – Jon

+0

Возможно, SSCCE (http://sscce.org) поможет нам увидеть проблему. Вы можете создать собственный собственный холст, не используя VTK, чтобы продемонстрировать проблему. Вы также можете перейти на JDK 1.6.17 (?) Или JDK 1.7, который теперь поддерживает смешивание компонентов AWT. – camickr

ответ

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

Я не знаю, что это такое, но это странно behavour в Java ...
Надеюсь, что это не помогает, пока вы» ve нашел лучшее решение ...

+0

Это грязно, но это работает для меня. Благодарю. – Jon

+0

@ Jon: Добро пожаловать. –

2

Вы своего рода повезло здесь. Там очень хорошая статья об этом на сайте ВС/оракула: http://java.sun.com/products/jfc/tsc/articles/mixing/

По сути, это сводится к этой рекомендации (взято из этой ссылки, под г-упорядочение товарная позиция):

Не смешивать легкие (Swing) и тяжеловесные (AWT) компоненты в контейнере , где ожидается, что легкий вес будет перекрываться с тяжелым грузом .

Edit: Я постоянно просматривающие этот сайт и наткнулся на другую ссылку, и, казалось бы, что ситуация несколько улучшилась: 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

+0

Извините, я буду только гадать. Мне не приходилось использовать Свинг в течение многих лет, поэтому я даже не знал, что у них есть проблема в некоторых случаях. – Goibniu

 Смежные вопросы

  • Нет связанных вопросов^_^