java - 将 JSplitPane 与 AWT 组件一起使用

标签 java swing awt jsplitpane

我有一个 AWT Canvas ,我无法将其转换为 Swing 组件(它来自 VTK)。我希望在 JSplitPane 中显示其中的一些 Canvas 。我读过有关在 Java 中混合重型和轻型组件的文章,并且知道这很麻烦,但我别无选择。如果我将 AWT Canvas 包裹在 JPanel 中,然后将其放在拆分 Pane 上,则拆分 Pane 根本不起作用。但是,如果我将 AWT Canvas 放在 JPanel 内,然后将其放在 JScrollPane 内,然后将那些滚动 Pane 放在 JSplitPane 上,则拆分 Pane 会起作用,但 AWT Canvas 组件无法正确调整大小。当移动 JSplitPane 的分隔线时,我不知道如何让 AWT Canvas 组件正确调整大小。我当时可以抓到分隔符移动操作并在 AWT Canvas 上操作,但我不知道该怎么做。我试过先调用 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 中是一种奇怪的行为......
希望这对您有所帮助,直到您找到更好的解决方案...

关于java - 将 JSplitPane 与 AWT 组件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999437/

相关文章:

java - 一个 FileOutputStream 构造函数会调用另一个 FileOutputStream 构造函数吗?

java - JList 所选项目到字符串 - 奇怪的结果 : Donnees. Marques@3d5bac58

java - 定制 JTable

java - 如何访问按钮的每个单独的 ActionPerformed?

java - ArrayList JTextField 空指针异常

java - 我如何获得每个映射器和化简器的执行时间

java - eclipse 用户界面 : Section heading in a TableWrapLayout

java - 如何将 Vector<Integer> 转换为 int[]?

Java实体表模型

Java:awt监听器中的抽象方法称为回调方法吗?