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

JLabel中的自定义字体被切断

欧阳狐若
2023-03-14

我有一个JLabel,我已经设置了自定义字体,“BP饮食”到它。如果我将此添加到JFrame中,文本看起来很好,但是当我将JFrame的布局更改为FlowLayout时,文本的顶部就会被切断。当您将JLabel添加到JPanel并将其添加到JFrame时,也会出现同样的问题。我在http://www.hichris.com/more/files/bpdiet.otf上有这个字体

下面是代码:

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.URL;

public class FontSizeTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel(
                "AaBbCcDdEeFfGgHhIiJjKk");
        label.setFont(createFont());
        frame.add(label);
        frame.pack();
        frame.setMinimumSize(frame.getMinimumSize());
        frame.setVisible(true);
    }

    static Font createFont() {
        Font customFont = null;
        try {
            URL url = new URL("http://www.hichris.com/more/files/BPdiet.otf");
            InputStream is = url.openStream();
            customFont = Font.createFont(Font.TRUETYPE_FONT, is);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(customFont);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return customFont.deriveFont(25f);
    }
}

感谢任何帮助!

共有1个答案

袁高明
2023-03-14

这里有一个观察。(底部有代码)

我得到了字体的字体度量,并在字体的重音和基线所在的地方画了一条线。您可以清楚地看到i中的点位于强调线的上方,这是截止线。标签的首选大小是使用度量值计算的。因此在此基础上,优选的大小将会切断i的一部分。但是j的底部不会被切断,因为考虑了下降线。

至于为什么消息会被切断,可能有几个原因。在您的原始代码中,没有遇到这个问题,可能是因为字体太小,并且FlowLayout有一个默认的5px间隙。在新的示例中,它使用pack()来切断,因为默认的BorderLayout没有默认的间隙。

就像AndrewThompson提到的那样,您可以通过使用emptybord来解决这个问题,或者为布局指定间隙。需要考虑的是flowlayout尊重组件的首选大小,因此标签将设置为其首选大小,同时考虑字体度量。borderlayout将不尊重首选大小,并且对于标签,将拉伸标签以适应布局位置并将文本垂直居中

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.URL;

public class FontSizeTest {
    static String message = "AaBbHhIiJjKk";

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createFontTestPanel());
        frame.pack();
        frame.setMinimumSize(frame.getMinimumSize());
        frame.setVisible(true);
    }

    static Font font = createFont();

    static JPanel createFontTestPanel() {
        return new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setFont(font);
                FontMetrics fm = g.getFontMetrics();
                int stringHeight = fm.getAscent();
                int stringWidth = fm.stringWidth(message);

                int beginString = getWidth()/2 - stringWidth/2;
                int baseString = getHeight()/2 + stringHeight/2;

                // draw accent line
                g.drawLine(0, baseString - stringHeight, getWidth(), baseString - stringHeight);
                // draw base line
                g.drawLine(0, baseString, getWidth(), baseString);
                // draw message
                g.drawString(message, beginString, baseString);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(500, 150);
            }
        };
    }

    static Font createFont() {
        Font customFont = null;
        try {
            URL url = new URL("http://www.hichris.com/more/files/BPdiet.otf");
            InputStream is = url.openStream();
            customFont = Font.createFont(Font.TRUETYPE_FONT, is);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(customFont);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return customFont.deriveFont(50f);
    }
}
 类似资料:
  • 问题内容: 我正在尝试在JFrame中使用特殊字体,但遇到了问题。我有一个这样定义的JLabel: 并且我有一个名为CUSTOMFONT-MEDIUM.TTF(TrueType字体)的文件,但是编写了以下内容: 代码会编译,并且一切正常,除了不会显示“ lab”,因此没有文本。我想这是因为我从未指定字体大小,但是我所做的任何尝试都失败了。有人可以帮我吗? 问题答案: 您创建的字体必须先在中注册,以

  • 从上面的图像中可以看到,一些文本被剪掉了:(代码: FONT:http://www.dafont.com/digital-7。FONT 如有任何帮助,我将不胜感激

  • 问题内容: 如何解决Java中自定义字体的问题? 例如,我的应用使用的字体并非在所有计算机上都使用。如果客户端计算机上不存在该文件,我可以以某种方式将其包含在已编译的可执行文件中,然后从那里调用它吗? 还有哪些其他选择?我可以将所有字体字符变成图像(之前在某些图形应用中),然后为每个字符显示图像…可以吗? 问题答案: 这是我用来从.ttf文件(可以捆绑)中加载字体文件的实用程序方法:

  • 我有一个JLabel,随着JFrame窗口的扩展,字体大小会自动改变。JLabel中的文本可以缩写,也可以放入全文,如下所示: 因为我对Swing使用了Eclipse的“AbsoluteLayout”(),所以JLabels不会自动调整到文本的大小,而是固定值。请注意,我确实会随着窗口大小的改变而改变这些固定值。我已经有了一个算法。 我想知道是否有一种方法来确定我的文本是否会显示成这样,而不是进行

  • 问题内容: 我正在Tkinter中创建界面,我需要自定义字体。不仅仅是说Helvetica具有特定大小或其他大小,还包括任何给定平台上通常不提供的字体。这将与程序一起作为图像文件或(最好是)Truetype字体文件或类似文件保留。我不想在要使用该程序的每台计算机上都安装所需的字体,我只想随程序一起将它们携带在同一目录中。 tkFont模块看起来应该执行类似的操作,但是我看不到它将在运行程序的系统通

  • 问题内容: 我正在使用Swift在Xcode(7.0版)中创建游戏,并且我想在游戏结束时以字体“ gameOver.ttf”显示标签“ Game Over”。我已将字体添加到资源文件夹中。我不知道如何在我的代码中引用它。我可以帮忙吗?我的代码: 问题答案: 这些是向您的应用程序添加自定义字体的步骤: 在您的应用程序中添加“ gameOver.ttf”字体(确保它已包含在目标中) 修改applica