我使用两个JSplitPanes
来显示一些信息。一个是水平分隔器,另一个是垂直分隔器。以下问题适用于JSplitPanes
。
当我调整应用程序主JFrame
的大小时,JSplitPanes
也会调整大小,因为它们必须占据屏幕的某个百分比(所有JPanels
调整为JFrame
调整大小,由MigLayout
的宽度和高度参数设置的行为。)
分隔符位置很重要,需要保持JSplitPane
的大小不变。我使用setResizeWeight()
和setDividerLocation()
来实现此目标。
主要问题是在JFrame
调整大小时,分隔符不会保持在0.0 / 0%,而是移动到~5-10%:
----->
我认为这是由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);
}
}
答案 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.