我使用两个JSplitPanes来展示一些信息。一个是水平分隔符,另一个是垂直分隔符。以下问题适用于两个JSplitPanes。
当我调整应用程序的主JFrame大小时,JSplitPanes也会调整大小,因为它们必须占据屏幕的一定比例(所有JPanels都会根据MigLayout的宽度和高度参数调整到JFrame大小)。
分隔符位置很重要,并且需要与JSplitPane的大小保持不变。我使用setResizeWeight()和setDividerLocation()来实现这一点。
主要问题是,在JFrame调整大小时,分隔符不会保持在0.0 / 0%处,而是移动到大约5-10%:
我认为这是由于resizeWeight引起的,但我试着调整了一下,行为没有任何改变。
有谁能帮我解决这个问题吗?我实现了一个ComponentAdapter,但除了将分隔符位置保存在变量或Preferences XML键中外,我无法在componentResized()上恢复分隔符位置。
示例代码:
当我调整应用程序的主JFrame大小时,JSplitPanes也会调整大小,因为它们必须占据屏幕的一定比例(所有JPanels都会根据MigLayout的宽度和高度参数调整到JFrame大小)。
分隔符位置很重要,并且需要与JSplitPane的大小保持不变。我使用setResizeWeight()和setDividerLocation()来实现这一点。
主要问题是,在JFrame调整大小时,分隔符不会保持在0.0 / 0%处,而是移动到大约5-10%:
我认为这是由于resizeWeight引起的,但我试着调整了一下,行为没有任何改变。
有谁能帮我解决这个问题吗?我实现了一个ComponentAdapter,但除了将分隔符位置保存在变量或Preferences XML键中外,我无法在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);
}
}