JLabel太宽了

时间:2016-03-17 01:44:11

标签: java swing layout-manager null-layout-manager

我编写了以下代码,这是一个简单的窗口,顶部有一个JLabel标头。代码如下:

import java.awt.Color;
import java.awt.Font;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Main extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String[] args) {
    init();
}

public Main() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    int WIDTH = 500;
    int HEIGHT = 500;
    setBackground(Color.LIGHT_GRAY);
    setSize(WIDTH, HEIGHT);
    setTitle("New Window");
    setLocationRelativeTo(null);

    JPanel pane = new JPanel();
    pane.setOpaque(false);
    setContentPane(pane);
    pane.setLayout(null);

    JLabel title = new JLabel("New Window", SwingConstants.CENTER);
    title.setFont(new Font("Neuropol", Font.PLAIN, 22));
    title.setSize(WIDTH, 20);
    title.setBorder(BorderFactory.createLineBorder(Color.black));
    pane.add(title);
}

static void init() {
    Main frame = new Main();
    frame.setVisible(true);
}

}

虽然我有一个奇怪的问题。如您所见,我将JLabel的宽度设置为与JFrame相同的宽度(因此与JPanel的宽度相同),但由于某种原因,标签超出了Frame的右边缘。框架的宽度为500,但我必须将JLabel设置为宽度483,以使边框位于JFrame内。我一遍又一遍,但看不出有什么不对劲。有人在这看到我的错误吗?

1 个答案:

答案 0 :(得分:3)

  

我将JLabel的宽度设置为与JFrame

相同的宽度

但JFrame宽度包括"装饰"框架,如边框。

  

我必须将JLabel设置为宽度483才能使边框位于JFrame内。

不,483会使标签对于框架而言太大。帧的边框不是17像素。我认为Borders每个都有4或5个像素,具体取决于LAF。

所以这是你不应该使用空布局的另一个原因,因为硬编码一个LAF的值可能不适用于另一个LAF。

此外,如果用户将框架调整得更宽,会发生什么?现在标签不会走到尽头。使用布局管理器设计动态GUI,以便在用户调整框架大小时适应更改。

最简单的解决方案是只使用框架内容窗格的默认BorderLayout。然后将标签添加到PAGE_START

add(title, BorderLayout.PAGE_START);

也没有理由创建内容窗格。该框架已经有一个使用BorderLayout的JPanel。

阅读Layout Managers上的Swing教程,了解更多信息和工作示例。下载演示代码并将其用作代码的起点。演示代码将向您展示如何更好地构建代码以遵循Swing约定。