Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel中的自定义字体被切断_Java_Swing_Fonts_Jlabel_Flowlayout - Fatal编程技术网

Java JLabel中的自定义字体被切断

Java JLabel中的自定义字体被切断,java,swing,fonts,jlabel,flowlayout,Java,Swing,Fonts,Jlabel,Flowlayout,我有一个JLabel,我已经为它设置了自定义字体“BP Diet”。如果我将其添加到JFrame中,文本看起来很好,但是一旦我将JFrame的布局更改为FlowLayout,文本的顶部就会被切断。将JLabel添加到JPanel并将其添加到JFrame时,也会出现同样的问题。我的字体在 代码如下: import java.awt.*; import javax.swing.*; import java.io.*; import java.net.URL; public class FontSi

我有一个JLabel,我已经为它设置了自定义字体“BP Diet”。如果我将其添加到JFrame中,文本看起来很好,但是一旦我将JFrame的布局更改为FlowLayout,文本的顶部就会被切断。将JLabel添加到JPanel并将其添加到JFrame时,也会出现同样的问题。我的字体在

代码如下:

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);
    }
}
应该如此

pack()之后出现

指向i&j上方点的大视图


感谢您的帮助

我安装了字体,并通过以下方式使用了
setFont
方法:

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.io.InputStream;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());//Un-commenting causes text to be cut off
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel(
                "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz");
        label.setFont(new Font("BPDiet", Font.BOLD, 15));
        frame.add(label);
        frame.setSize(800, 500);
        frame.setVisible(true);
    }
}
我删除了你的方法,并以一种更简单的方式设置字体,如果你仍然需要该方法,那么只需回复,这样我就可以尝试添加或解决该问题

试试看,告诉我是否有用:)

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

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

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

您可以通过使用
EmptyBorder
,或指定布局的间距来解决此问题,如AndrewThompson所述。要考虑的是,<代码> FlowLayout < /C>尊重组件的首选大小,因此将考虑到字体度量,将标签设置为其首选大小。
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);
    }
}

我正在运行您的代码,当您取消对setLayout方法的注释时,没有任何内容被截断:)好的,所以它不是被截断,只是从中间向上移动。可以吗?我是说我的逻辑?不,这东西实际上被切断了,如果你放大你可以看到“我”的顶部被切断了,但它只是在屏幕的顶部。如果你制作了多个标签,你可以看到它们的顶部都被剪掉了。这就是奇怪的地方。我认为这种字体比普通字体大,这就是为什么它被剪掉了。我还可以设置标签的最小尺寸,但它仍然被切断。有人知道为什么会这样吗?我如何指定字体的位置?我仍然需要用createFont()方法注册字体?只是不返回任何内容?字体会显示在系统上的默认字体文件夹中,因此您无需执行任何操作,只需安装它即可。你试过这个程序吗?不从何处返回任何内容?该字体不是系统上的默认字体。我必须从我假定的文件中指定它?我也不想让用户安装它。然后让我尝试根据您的需要进行修复:)此外,我已将字体安装到我的系统中,字体顶部仍然被切断。我使用了你给我的代码,但它不能按你的要求工作。是否可以根据字体的大小计算出所需的空白边框大小?问题是FontMetrics应该计算出字体的大小。您的字体有问题,导致它没有考虑到
i
j
的要点。所以我认为没有办法,特别是对于这种字体