我有一个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);
}
}
答案 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可能无法正常工作 轻量级和重量级的地方 组件正在混合。有 没有已知的解决方法。