gpt4 book ai didi

java - 如何从 Java 中使用 Graphics 显示的字符串末尾删除空格?

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:57 27 4
gpt4 key购买 nike

我的类 GraphicButton.java 创建了一个自定义的 JButton,它具有特定的文本和字体以及一个矩形边框。我的问题是字符串中的最后一个字符和我想要删除的边框末尾之间有一些额外的空格。

下面是带有字符串“PLAY”和字体 FFF ForwardGraphicButton 实例。 (直接下载链接)添加到 JFrame红线是我要删除的空间

这是我正在使用的代码(省略了JFrame 创建和设置):

GraphicButton.java:

public class GraphicButton extends JButton {

private static final long serialVersionUID = 1L;

//Fields
private String text;
private Font font;

//Constructor
public GraphicButton(String text, Font font) {
super(text);

this.text = text;
this.font = font;
//Setting preferred size here.
this.setPreferredSize(new Dimension(this.getFontMetrics(font).stringWidth(text), this.getFontMetrics(font).getAscent()));
}

@Override
public void paintComponent(Graphics g) {
g.setFont(this.font);

//Draw text
g.drawString(this.text, 0, this.getHeight());
//Draw border
g.drawRect(0, 0, this.getWidth(), this.getHeight());
}
}

我在装有 Java 1.8 的 Mac 上运行 Eclipse。

最佳答案

您可以使用 TextLayout 来获得更好的宽度计算。

在下面的示例中,您可以看到使用 TextLayoutFontMetrics 之间的区别:

import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;

public class DrawTest extends JPanel
{
String text;

public DrawTest(String text)
{
this.text = text;
// setFont( new Font("Arial", Font.PLAIN, 24) );
setFont( new Font("Monospaced", Font.PLAIN, 24) );
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setFont( getFont() );
g2d.setPaint(Color.RED);

// Draw text using FontMetrics

FontMetrics fm = g2d.getFontMetrics();
Rectangle2D rect = fm.getStringBounds(text, g2d);
rect.setRect(rect.getX() + 100, rect.getY() + 50, rect.getWidth(), rect.getHeight());
g2d.draw(rect);

// Draw text using TextLayout

g2d.setPaint(Color.BLACK);

Point2D loc = new Point2D.Float(100, 50);
FontRenderContext frc = g2d.getFontRenderContext();
TextLayout layout = new TextLayout(text, getFont(), frc);
layout.draw(g2d, (float)loc.getX(), (float)loc.getY());

Rectangle2D bounds = layout.getBounds();
bounds.setRect(bounds.getX()+loc.getX(), bounds.getY()+loc.getY(), bounds.getWidth(), bounds.getHeight());
g2d.draw(bounds);
}

private static void createAndShowUI()
{
DrawTest text = new DrawTest("This is some ugly test i");

JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( text );
frame.setSize(400, 200);
frame.setLocationByPlatform( true );
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

此外你不应该:

  1. 正在设置首选尺寸。相反,您应该覆盖 getPreferredSize() 方法以返回大小

  2. 在绘画方法中设置字体。所有组件都支持 setFont() 方法。所以只需在构造函数中设置字体即可。

关于java - 如何从 Java 中使用 Graphics 显示的字符串末尾删除空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com