Использование JSplitPane с компонентом AWT - PullRequest
4 голосов
/ 22 октября 2010

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

Есть идеи?

Вот пример проблемы

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

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Это грязный путь, но это решит его:

Когда вы звоните 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 ...
Надеюсь, это поможет, пока вы не найдете лучшее решение ...

2 голосов
/ 26 октября 2010

Вам не повезло здесь. На сайте Sun / 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 <альфа <255) не поддерживается. Если частично полупрозрачный легкий компонент перекрывает тяжеловесный компонент, тяжеловес компонент не будет отображаться до конца. </p>

* Embedded heavyweight components must belong to the process that

создал фрейм или апплет. тяжелый компонент должен иметь действительный сверстник в основном процессе приложение (или апплет).

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

InputMap, может работать неправильно где легкий и тяжелый компоненты смешиваются. Есть нет известных обходных путей.

...