4

我有一个无法转换为 Swing 组件的 AWT 画布(它来自VTK)。我希望在 JSplitPane 中显示其中一些画布。我已经阅读了有关在 Java 中混合重型和轻型组件的文章,并且知道这很麻烦,但我别无选择。如果我将 AWT 画布包装在 JPanel 内,然后将其放在拆分窗格上,则拆分窗格根本不起作用。但是,如果我将 AWT 画布放在 JPanel 内,然后将其放在 JScrollPane 内,然后 JSplitPane 上的那些滚动窗格,拆分窗格确实起作用,但 AWT 画布组件无法正确调整大小。当 JSplitPane 的分隔线被移动时,我不知道如何让 AWT 画布组件正确调整大小。当时我可以捕捉分隔线移动操作并在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);
    }
}
4

2 回答 2

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

于 2010-10-26T15:50:53.770 回答
2

你在这里有点不走运。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 < alpha < 255)。如果部分半透明的轻量级组件与重量级组件重叠,则重量级组件将不会显示出来。

* Embedded heavyweight components must belong to the process that

创建框架或小程序。重量级组件必须在应用程序(或小程序)的主进程中具有有效的对等点。

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

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

于 2010-10-26T11:01:45.247 回答