Java Swing:宽度问题

时间:2012-10-24 16:53:05

标签: java swing layout layout-manager preferredsize

我在理解应用程序的行为方面遇到了问题。我想创建一个简单的窗口( 1000x700px ),分为两部分( 250px 750px 宽度)。我尝试了以下代码:

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);
    }
}

如您所见,我手动设置JFrameFlowLayout而不是BorderLayout的布局管理器,其中水平和垂直间隙为)。当然,我可以使用BorderLayout而不是add()方法使用BorderLayout.EASTBorderLayout.WEST参数,但我想了解FlowLayout的错误。 当我运行我的应用程序时,我得到以下内容(没有绿色JPanel):enter image description here

如果我减小宽度(例如content_panel_wrap并使其 744px 而不是 750px ,则一切正常。 enter image description here 所以问题是 - 这些奇怪的6像素是什么?我不确定这个值是否适用于所有操作系统,所以我想了解它的来源。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

  

使此窗口的大小适合首选大小和布局   其子组件。如果窗口和/或其所有者尚未   可显示,两者都可以在计算之前显示   首选尺寸。 Window将在preferredSize之后验证   计算。

<强>提示:

  • 不要不必要地延长JFrame
  • 创建和更改UI组件时使用Event Dispatch Thread

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
          // create UI components etc here
        }
      });
    
  • 请勿调用setPreferredSize()而是覆盖组件的getPrefferedSize()
  • 请勿在{{1​​}}上致电setSize(...),而是在设置JFrame之前致电JFrame#pack()
  • 请勿忘记致电JFrame#defaultCloseOperation(..),否则JFrame关闭时您的初始/ EDT广告将不会被终止。

以下是结合我的建议和代码的示例:

enter image description here

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();
            }
        });
    }
}