如何在Java中正确设置最小大小?
对于我在Java中创建的GUI应用程序,我有以下内容:
- JFrame,设置为最小大小为 (300,200)
- 一个JSplitPane,其中是:
- 在左边,一个JScrollPane(包含一个JTree),最小大小为(100,0)(我只想将宽度限制为200)
- 右侧是最小大小为 (200,0) 的 JPanel
在以下情况下,大小调整不会给我带来任何问题:
- 将 JSplitPane 的大小一直调整到左侧(调整为 JScrollPane 的最小大小),然后调整窗口大小
- 只需在一定程度上调整窗口大小
当我将JSplitPane移动到太靠近右侧时,就会出现问题,从而调整窗口大小时,JSplitPane右侧的JPanel无法遵守我设置的最小宽度。
我试图在JScrollPane上设置最大宽度,这似乎根本没有帮助。
是否有涉及最大尺寸的东西我必须做?或者也许有一种方法可以将监听器附加到其中一个面板上以强制我所需的行为?最终,我只希望JSplitPane中的右侧面板永远不会小于200px宽。
以下是我正在经历的行为示例:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
public class ResizeTest
{
private JFrame frame;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ResizeTest window = new ResizeTest();
window.frame.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
}
public ResizeTest()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setMinimumSize(new Dimension(300, 200));
frame.setBounds(100,100,450,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
JSplitPane splitPane = new JSplitPane();
frame.getContentPane().add(splitPane);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setMinimumSize(new Dimension(100, 0));
splitPane.setLeftComponent(scrollPane);
JTree tree = new JTree();
tree.setMinimumSize(new Dimension(100, 0));
scrollPane.setViewportView(tree);
JPanel panel = new JPanel();
panel.setMinimumSize(new Dimension(200, 0));
splitPane.setRightComponent(panel);
}
}
更新:
恐怕我不完全理解在提出的解决方案中试图提出的观点,除了setPreferred()和setMinimum/Maximum()最好避免。
我的问题是,除了使用这些方法之外,我有什么选择来限制JSplitPane分隔器?MadProgrammer提到了监听组件Resize事件,但我需要进一步澄清原因。我是否调用 setDividerLocation() 来响应此事件?
如果附加的问题完全是一个单独的StackOverflow问题,我提前道歉,如果有必要,我可以发布另一个问题并链接到这里。
更新 2:
简单地说,调节用户选择窗口大小的方式,并在JScrollPane中拥有正确的面板是一个可行的选择吗?在我看来,这有点像一种标准做法。