如何在Java中正确设置最小大小?

如何在Java中正确设置最小大小?,java,swing,resize,autoresize,Java,Swing,Resize,Autoresize,对于我用Java创建的GUI应用程序,我有以下几点: JFrame,最小尺寸设置为(300200) JSplitPane,其中包括: 左边是最小大小为(100,0)的JScrollPane(包含JTree)(我只想将宽度限制为200) 右边是最小尺寸为(200,0)的JPanel 在以下情况下,尺寸不会给我带来任何问题: 一直向左调整JSplitPane的大小(到JScrollPane的最小大小),然后再调整窗口的大小 只是在一定程度上调整窗口的大小 当我将JSplitPane移得太

对于我用Java创建的GUI应用程序,我有以下几点:

  • JFrame,最小尺寸设置为(300200)
  • JSplitPane,其中包括:
    • 左边是最小大小为(100,0)的JScrollPane(包含JTree)(我只想将宽度限制为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提到了监听组件化事件,但我需要进一步澄清一下原因。我是否调用setDividerLocation()以响应此事件

我提前道歉,如果附加的问题是作为一个单独的StackOverflow问题完全意味着,我可以张贴另一个和链接在这里,如果必要的

更新2:


简单地说,不规范用户选择窗口大小的方式以及在JScrollPane中使用右侧面板是可行的选择吗?在我看来,这有点像一种标准做法。

首先,方法
setMinimumSize
是对
LayoutManager
API的建议。可以忽略的建议

为了能够更接近于支持这一点,您需要使用类似的工具来监视事件

我能想到的最佳解决方案是使用实际使用最小和最大大小约束的
LayoutManager
,类似于
GridBagLayout

在“内容”窗格上使用此选项,并将您的
JSplitPane
放在该选项上(相应地设置其最小和最大大小),然后将“内容”窗格添加到框架中

更新

对不起,我可能遗漏了一些非常明显的东西,但我把这个小测试放在一起,我希望它有一些有用的想法:p

public class TestFrameSize extends JFrame {

    public TestFrameSize() throws HeadlessException {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(600, 600);
        setLocationRelativeTo(null);

        setMinimumSize(new Dimension(250, 250));

        JLabel left = new JLabel("Left");
        JLabel right = new JLabel("Right");

        Dimension pSize = new Dimension(100, 100);
        Dimension mSize = new Dimension(25, 100);

        left.setPreferredSize(pSize);
        left.setMinimumSize(mSize);
        right.setPreferredSize(pSize);
        right.setMinimumSize(mSize);

        JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);

        JPanel content = new JPanel(new GridBagLayout());
        content.add(pane);

        setLayout(new BorderLayout());
        add(content);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        new TestFrameSize().setVisible(true);

    }
}
在这种情况下,
JSplitPane
内容的首选大小最初设置为
getPreferredSize()
中组件首选大小的小倍数。请注意,
JSplitPane
将不小于面板的最小尺寸,由附带的
Jlabel
管理


请编辑您的问题,以包含一个显示您描述的问题的。我知道
面板。setMinimumSize
仅用于演示,但
树。setMinimumSize
是一个问题+1对于,顺便说一句。
窗口
容器
继承
set/getMinimumSize
。虽然我很确定OP也想限制帧的大小,但使用
setMinimumSize
不会有效果……我错了吗:PHa,你知道吗,
setMinimumSize
JFrame
上实际起作用了:PI对
JLabel#setPreferredSize()
很警惕。IIUC,
GridBagLayout
具有默认约束,其行为类似于
GridBagLayout
。在大多数平台上,文本可能不会被截断,但这是一个有待解决的问题。是的,这是一个很好的观点(它只是一个演示)。就我个人而言,我讨厌preferred/min/max size,如果不能在macOS上使用,我会尽量避免,在窗口上调用
setMinimumSize()
是限制用户可用的最小大小的唯一方法。如果您希望布局管理器计算最小大小,请参阅我发布的解决方案。您的示例在Mac OS X上的效果与预期一样,
com.apple.laf.AquaLookAndFeel
,其中拆分窗格的UI委托在两个窗格上强制执行最小值。