我有一个 AWT 画布,无法将其转换为 Swing 组件(它来自VTK http://www.vtk.org/)。我希望在 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);
}
}
这是一种肮脏的方式,但这可以解决它:
你打电话时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 中的一个奇怪的行为......
希望这对您有所帮助,直到您找到更好的解决方案......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)