将JSplitPane与AWT组件一起使用

时间:2010-10-22 17:37:34

标签: java swing awt jsplitpane

我有一个AWT画布,我无法将其转换为Swing组件(它来自VTK)。我希望在JSplitPane中显示一些这样的画布。我已经读过在Java中混合重量和重量轻的组件,并且知道这是一个痛苦的屁股,但我没有选择。如果我将AWT画布包装在JPanel中,然后将其放在拆分窗格上,则拆分窗格根本不起作用。但是,如果我将AWT画布放在JPanel中,然后放在JScrollPane内部,然后放在JSplitPane上的那些滚动窗格,则拆分窗格会起作用,但AWT画布组件不会正确调整大小。我失去了关于如何在移动JSplitPane的分隔符时使AWT画布组件正确调整大小。我可以捕捉分频器移动操作并在那时操作AWT画布,但我不知道该怎么做。我试过调用invalidate()然后验证()然后重绘(),但这不起作用。

有什么想法吗?

以下是问题的一个示例

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 个答案:

答案 0 :(得分:4)

这是一种肮脏的方式,但这将解决它:

如果在不调整窗口大小的情况下调用pack(),则不会发生太多事情。因此,当您第一次调整窗口大小然后调用pack()时,会正确绘制您的组件。这意味着你可以将这个脏方法放在你的divider移动监听器方法中:

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中是一种奇怪的行为......
希望这会有所帮助,直到找到更好的解决方案......

答案 1 :(得分:2)

你在这里运气不好。在sun / oracle网站上有一篇非常好的文章: http://java.sun.com/products/jfc/tsc/articles/mixing/

基本上它归结为这个指南(取自该链接,在z排序标题下):

  

不要混合轻量级(Swing)和   a中的重量级(AWT)组件   容器哪里轻巧   组件预计会重叠   重量级的。

编辑:我一直浏览该网站并遇到另一个链接,看起来状况略有改善:http://java.sun.com/developer/technicalArticles/GUI/mixing_components/但我认为您的案例是限制部分底部列出的案例之一:

  

限制

     

不支持以下几种情况:

* Non-opaque lightweight components that have translucent
     

像素(0 <α<255)不是   支持的。如果是部分半透明的   轻量级组件重叠a   重量级组件,重量级   组件不会显示。

* Embedded heavyweight components must belong to the process that
     

创建了框架或小程序。该   重量级组件必须有一个   主要进程内的有效对等体   应用程序(或applet)。

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

InputMap可能无法正常工作   轻量级和重量级的地方   组件正在混合。有   没有已知的解决方法。