【发布时间】:2011-04-29 07:18:57
【问题描述】:
我有一个无法转换为 Swing 组件的 AWT 画布(它来自 VTK)。我希望在 JSplitPane 中显示其中一些画布。我已经阅读了有关在 Java 中混合重型和轻型组件的文章,并且知道这很麻烦,但我别无选择。如果我将 AWT 画布包装在 JPanel 内,然后将其放在拆分窗格上,则拆分窗格根本不起作用。但是,如果我将 AWT 画布放在 JPanel 内,然后将其放在 JScrollPane 内,然后在 JSplitPane 上的那些滚动窗格,拆分窗格确实起作用,但 AWT 画布组件无法正确调整大小。当 JSplitPane 的分隔线被移动时,我不知道如何让 AWT 画布组件正确调整大小。当时我可以捕捉分隔线移动操作并在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);
}
}
【问题讨论】:
-
您的意思是 JScrollPane 而不是 JScrollBar?
-
也许 SSCCE (sscce.org) 会帮助我们发现问题。您可以创建自己的简单 Canvas,而无需使用 VTK 来演示问题。您还可以升级到现在支持混合 AWT 组件的 JDK 1.6.17 (?) 或 JDK 1.7。
-
我添加了一个简短的类来显示问题的示例。
-
我也在用JDK1.6 17编译
标签: java swing awt jsplitpane