将JSplitPane与AWT组件一起使用

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

有任何想法吗?

这是问题的一个例子

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

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

如果在不调整窗口大小的情况下调用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中是一种奇怪的行为……
希望这会有所帮助,直到找到更好的解决方案……

你在这里运气不好。 在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

 * Embedded heavyweight components must belong to the process that 

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

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

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