编程语言
首页 > 编程语言> > java – 将JSplitPane与AWT组件一起使用

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

作者:互联网

我有一个AWT画布,我无法转换为Swing组件(它来自VTK).我希望在JSplitPane中显示一些这样的画布.我已经读过在Java中混合重量和重量轻的组件,并且知道这是一个痛苦的屁股,但我没有选择.如果我将AWT画布包装在JPanel中,然后将其放在拆分窗格上,则拆分窗格根本不起作用.但是,如果我将AWT画布放在JPanel中,然后放在JScrollPane内部,然后放在JSplitPane上的那些滚动窗格,则拆分窗格会起作用,但AWT画布组件不会正确调整大小.我失去了关于如何在移动JSplitPane的分隔符时使AWT画布组件正确调整大小.我可以捕捉分频器移动操作并在那时操作AWT画布,但我不知道该怎么做.我已经尝试调用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中是一种奇怪的行为……
希望这会有所帮助,直到找到更好的解决方案……

标签:java,swing,awt,jsplitpane
来源: https://codeday.me/bug/20190606/1189584.html