当前位置: 首页 > 知识库问答 >
问题:

如何正确设置Java最小尺寸?

安建木
2023-03-14

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

  • 一个JFrame,设置为最小大小为(300,200)
  • 一个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);
        }
    }
    

    更新:

    恐怕我不完全理解在建议的解决方案中试图提出的观点,除了set首选()和set最小/最大()最好避免。

    了解到这一点后,我的问题是,除了使用这些方法之外,我还可以选择哪些方法来限制JSplitPane除法器?MadProgrammer提到了监听ComponentResistized事件,但我需要进一步澄清一下原因。我是否调用setDividerLocation()以响应此事件?

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

    更新2:

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

共有2个答案

苏鸿羽
2023-03-14

在本例中,JSplitPane内容的首选大小最初设置为getPreferredsize()中组件首选大小的小倍数。请注意,JSplitPane将不小于面板的最小大小,由附带的Jtag管理。

莫承运
2023-03-14

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

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

我能想到的最好的解决方案是使用一个真正使用最小和最大大小约束的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);

    }
}
 类似资料:
  • 问题内容: 我正在尝试运行Java程序,但是它采用默认的GMT时区而不是OS定义的时区。我的JDK版本是1.5,操作系统是Windows Server Enterprise(2007) Windows指定了中央时区,但是当我运行以下程序时,它给了我GMT时间。 这是输出 请注意,我不想从应用程序中设置时区。我希望JVM使用的时区应该是操作系统中指定的时区。(对于具有JDK 1.4版和Microso

  • 问题内容: 我试图通过向catalina.sh添加以下行来调整tomcat 7(CentOS,java -version:1.6.0_25-b06)实例的初始堆大小: 启动tomcat失败,并将以下消息记录到catalina.out: 这些选项有什么问题? 问题答案: 您不得使用。只需使用以下命令:

  • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?

  • 我正试图在我的Fedora 22上安装MATLAB。最后,我得到一个错误 应用程序遇到意外错误,需要关闭。您可能需要尝试重新安装产品。更多信息可以在 /tmp/mathworks_root.log找到 当我查看mathworks_root.log文件时,我发现在安装步骤中未正确设置Java Home Java Home /tmp/mathworks_32206/sys/java/jre/glnxa

  • 问题内容: 我在设置布局时遇到一些问题。(不要介意按钮的大小,我只想正确地了解布局)。 Here’s my code: 谁能帮助我了解布局的工作原理? 我一直在观看很多视频,并尝试过不同的布局,但仍然无法正确完成。告诉我是否使用了正确的布局,或者是否应该更改布局 。 问题答案: 如 该答案中所建议的那样,可以为左部分提供所需的全部控制。如果您愿意为简单起见而牺牲一些控制权,则可以在a里面放两个面板