JFrame调整大小会移动JSplitPane分隔符

时间:2015-02-05 18:10:36

标签: java swing jframe jsplitpane

我使用两个JSplitPanes来显示一些信息。一个是水平分隔器,另一个是垂直分隔器。以下问题适用于JSplitPanes

当我调整应用程序主JFrame的大小时,JSplitPanes也会调整大小,因为它们必须占据屏幕的某个百分比(所有JPanels调整为JFrame调整大小,由MigLayout的宽度和高度参数设置的行为。)

分隔符位置很重要,需要保持JSplitPane的大小不变。我使用setResizeWeight()setDividerLocation()来实现此目标。

主要问题是在JFrame调整大小时,分隔符不会保持在0.0 / 0%,而是移动到~5-10%:

Pre-resize -----> Post-resize

我认为这是由resizeWeight引起的,但我玩了它并且行为没有任何变化。

有人可以帮我解决这个问题吗?我实现了一个ComponentAdapter,但没有将分隔符的位置保存在变量或Preferences XML-key中,我无法恢复分隔符在componentResized()上的位置。

示例代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;

import net.miginfocom.swing.MigLayout;


public class JSplitPaneTest {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setMinimumSize(new Dimension(500, 500));

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new MigLayout());

        JPanel panel1 = new JPanel();
        panel1.setBackground(Color.RED);

        JPanel panel2 = new JPanel();
        panel1.setBackground(Color.GREEN);

        final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                panel1, panel2);
        splitPane.setResizeWeight(0.5);
        splitPane.setOpaque(false);
        splitPane.setOneTouchExpandable(true); // does not work on Linux :(
        splitPane.setBorder(null);

        mainPanel.add(splitPane, "w 100%, h 90%, wrap");

        JButton button = new JButton("Set to 0");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                splitPane.setDividerLocation(0.0);
            }
        });

        mainPanel.add(button, "span");

        frame.add(mainPanel);
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:1)

我和@ChrisK在同一个项目上工作,今天看看这个。我相信我已经修复了这个问题,虽然我没有确认窗口调整大小触发的特定症状(因为我们移动到静态大小的jSplitPane并且调整窗口大小不再改变分隔符位置)。但是,我们遇到了另一个问题,我认为是由相同的基本问题引起的:在从0位移动分频器之后,人们再也无法手动将分频器拖回到位置0.原来这是由于jPanel&#39 ; s最小尺寸,从未明确设定。事实证明,leftComponent.getMinimumSize()返回(随机/任意?)32,这恰好是分隔线无法拖过的最左侧像素位置。

因此,我所做的就是致电:

panel1.setMinimumSize(new Dimension(0,0));

允许将分隔线一直拖到左边/顶部并且:

panel2.setMinimumSize(new Dimension(0,0));

允许将分隔线一直拖到右侧/底部。

我相信这些值会在组件调整大小时干扰分隔符位置。我无法弄清楚为什么面板尺寸的看似任意的最小值(32x47)被设定。构造面板后,立即由getMinimumSize返回这些值。如果有人知道这些是如何计算的,那么它可能会提供更全面的情况。如果有帮助,分隔符拖动尺寸中分割窗格的宽度/高度静态设置为180.