2

我无法理解我的应用程序的行为。我想创建一个简单的窗口(1000x700px),分为两部分(分别为250px750px宽度)。我尝试了以下代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example extends JFrame
{
    private static final long serialVersionUID = 1L;

    public Example()
    {
        this.setSize(1000, 700);
        this.setTitle("Example");
        this.setResizable(false);
        this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

        JPanel navigation_panel_wrap = new JPanel();
        JPanel content_panel_wrap = new JPanel();
        navigation_panel_wrap.setPreferredSize(new Dimension(250, 700));
        content_panel_wrap.setPreferredSize(new Dimension(750, 700));
        content_panel_wrap.setBackground(Color.green);
        navigation_panel_wrap.setBackground(Color.red);
        this.getContentPane().add(navigation_panel_wrap);
        this.getContentPane().add(content_panel_wrap);
    }

    public static void main(String[] args)
    {
        Example example = new Example();
        example.setVisible(true);
    }
}

如您所见,我手动设置了布局管理器JFrame(而FlowLayout不是零水平和垂直间隙)。当然,我可以只使用and 而不是使用带有和 参数的方法,但我想了解. 当我运行我的应用程序时,我得到以下信息(没有绿色): BorderLayoutBorderLayoutadd()BorderLayout.EASTBorderLayout.WESTFlowLayoutJPanel在此处输入图像描述

例如,如果我减小宽度content_panel_wrap并将其设置为744px而不是750px,则一切正常。 在此处输入图像描述 所以问题是 - 这些奇怪的 6 个像素是什么?我不确定这个值对于所有操作系统都是恒定的,所以我想了解它的起源。

4

2 回答 2

4

没有任何问题,FlowLayout但您需要调用pack()所有组件的大小。

于 2012-10-24T16:59:36.917 回答
3

至于您的代码问题(对@Reimeus 的+1)​​调用pack()是解决方案。根据文档:

使此 Window 调整大小以适合其子组件的首选大小和布局。如果窗口和/或其所有者还不能显示,则在计算首选大小之前,两者都可以显示。在计算出首选大小后,将验证窗口。

尖端:

  • JFrame不要不必要地扩展。
  • 创建和更改 UI 组件时使用事件调度线程:

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
          // create UI components etc here
        }
      });
    
  • 不要调用组件的setPreferredSize()覆盖getPrefferedSize()
  • setSize(...)在将其设置为可见之前不要调用JFrame而是调用。JFrame#pack()
  • 不要忘记调用JFrame#defaultCloseOperation(..),否则您的初始/EDT 线程在关闭时不会终止JFrame

这是一个结合了我的建议和您的代码的示例:

在此处输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Example {

    private final JFrame frame;

    public Example() {
        frame = new JFrame();
        frame.setTitle("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//app exited when frame closes
        frame.setResizable(false);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

        JPanel navigation_panel_wrap = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(250, 700);
            }
        };
        JPanel content_panel_wrap = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(750, 700);
            }
        };

        content_panel_wrap.setBackground(Color.green);
        navigation_panel_wrap.setBackground(Color.red);

        frame.add(navigation_panel_wrap);
        frame.add(content_panel_wrap);
        //pack frame (size components to preferred size)
        frame.pack();
        frame.setVisible(true);//make frame visible
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}
于 2012-10-24T17:29:35.583 回答