JLabel 太宽
JLabel too wide
我写了下面的代码,它是一个简单的 window,顶部有一个 JLabel header。代码如下:
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 的宽度相同),但由于某种原因,标签超出了框架的右边缘。框架的宽度为 500,但我必须将 JLabel 的宽度设置为 483,以便边框位于 JFrame 内。我已经一遍又一遍地检查了这个,但看不出有什么不对。有人在这里看到我的错误吗?
I set the width of the JLabel to the same width as the JFrame
但 JFrame 宽度包括框架的 "decorations",如边框。
I have to set the JLabel to a width of 483 in order for the border to be within the JFrame.
不,483 会使标签对于框架来说太大了。框架的边框不是 17 像素。我认为边框是 4 或 5 个像素,具体取决于 LAF。
因此,这是您不应使用空布局的另一个原因,因为对一个 LAF 的值进行硬编码可能不适用于另一个 LAF。
此外,如果用户将框架调整得更宽,会发生什么情况?现在标签不会走到尽头。使用布局管理器设计动态 GUI,以适应用户调整框架大小时的变化。
最简单的解决方案是只使用框架内容窗格的默认 BorderLayout。然后将标签添加到 PAGE_START
.
add(title, BorderLayout.PAGE_START);
也没有理由创建内容窗格。该框架已经有一个使用 BorderLayout 的 JPanel。
阅读 Layout Managers 上的 Swing 教程,了解更多信息和工作示例。下载演示代码并将它们用作代码的起点。演示代码将向您展示如何更好地构建代码以遵循 Swing 约定。
我写了下面的代码,它是一个简单的 window,顶部有一个 JLabel header。代码如下:
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 的宽度相同),但由于某种原因,标签超出了框架的右边缘。框架的宽度为 500,但我必须将 JLabel 的宽度设置为 483,以便边框位于 JFrame 内。我已经一遍又一遍地检查了这个,但看不出有什么不对。有人在这里看到我的错误吗?
I set the width of the JLabel to the same width as the JFrame
但 JFrame 宽度包括框架的 "decorations",如边框。
I have to set the JLabel to a width of 483 in order for the border to be within the JFrame.
不,483 会使标签对于框架来说太大了。框架的边框不是 17 像素。我认为边框是 4 或 5 个像素,具体取决于 LAF。
因此,这是您不应使用空布局的另一个原因,因为对一个 LAF 的值进行硬编码可能不适用于另一个 LAF。
此外,如果用户将框架调整得更宽,会发生什么情况?现在标签不会走到尽头。使用布局管理器设计动态 GUI,以适应用户调整框架大小时的变化。
最简单的解决方案是只使用框架内容窗格的默认 BorderLayout。然后将标签添加到 PAGE_START
.
add(title, BorderLayout.PAGE_START);
也没有理由创建内容窗格。该框架已经有一个使用 BorderLayout 的 JPanel。
阅读 Layout Managers 上的 Swing 教程,了解更多信息和工作示例。下载演示代码并将它们用作代码的起点。演示代码将向您展示如何更好地构建代码以遵循 Swing 约定。