java - 如何在 Java 中正确设置最小尺寸?

标签 java swing resize autoresize

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

  • 一个 JFrame,最小大小设置为 (300,200)
  • 一个 JSplitPane,其中:
    • 左边是一个最小尺寸为(100,0)的JScrollPane(包含一个JTree)(我只想限制宽度为200)
    • 在右侧,一个最小尺寸为 (200,0) 的 JPanel

在以下情况下,尺寸不会给我带来任何问题:

  • 一直向左调整 JSplitPane 的大小(到 JScrollPane 的最小大小),然后再调整窗口大小
  • 只是在一定程度上调整窗口大小

当我将 JSplitPane 向右移动太近时会出现问题,因此调整窗口大小时 JSplitPane 右侧的 JPanel 无法遵守我设置的最小宽度。

我尝试在 JScrollPane 上设置最大宽度,这似乎根本没有帮助。

我必须做一些涉及最大尺寸的事情吗?或者也许有一种方法可以将 Listener 附加到其中一个面板以强制执行我想要的行为?最终,我只希望 JSplitPane 中的右侧面板的宽度永远不会小于 200 像素。

这是我遇到的行为示例:

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 提到了对 componentResized 事件的监听,但我需要进一步说明原因。我是否调用 setDividerLocation() 来响应此事件?

如果附加的问题完全是一个单独的 StackOverflow 问题,我提前表示歉意,如果需要,我可以发布另一个问题并在此处链接。

更新 2:

是否根本没有规定用户如何选择调整窗口大小以及在 JScrollPane 中设置正确的面板是一个可行的选择?在我看来,这有点像标准做法。

最佳答案

首先,方法setMinimumSize 是对LayoutManager API 的建议。一个可能被忽略的建议。

为了能够接近支持这一点,您需要使用类似 ComponentListener 的东西。并监控 componentResized事件。

我能想到的最佳解决方案是使用 LayoutManager,它实际上使用了最小和最大尺寸限制,例如 GridBagLayout

在“内容” Pane 上使用它,并将你的 JSplitPane 放在它上面(相应地设置它的最小和最大大小),然后将“内容” Pane 添加到框架。

更新

抱歉,我可能遗漏了一些非常明显的东西,但我把这个小测试放在一起,我希望它有一些想法可以帮助 :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);

    }
}

关于java - 如何在 Java 中正确设置最小尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485555/

相关文章:

objective-c - 使用比例变换与边界操作调整 CATiledLayer 的大小

jquery - 调整父菜单jquery的大小?

java - 通过表达式语言访问 Java Bean 属性

java - 抛出带有消息的简单异常

java - 自动滚动到文本区域的底部

java - 有没有办法为 JOptionPane.showOptionDialog 设置布局?

python - 使用 PIL 在 Django 中调整上传文件的大小

Java 进程 exitValue 错误

java - 如何从 hashmap 中获取一列值

Java Swing JButton 时间延迟(闪烁)