我有一个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);
}
}
感谢任何帮助!
这里有一个观察。(底部有代码)
我得到了字体的字体度量,并在字体的重音和基线所在的地方画了一条线。您可以清楚地看到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