此代码的提议是使用方法getStringHeight而不使用Graphics g
。然后我创建这个代码,但是当执行命令System.out.println(this.getStringHeight(font, string));
时,返回始终为0,因为repaint()
无法正常工作。我想知道为什么以及如何解决它。
基本上,在返回之前,我需要使用paintComponent来计算String Height,然后返回值。
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Panel extends JPanel {
String string = "HELLO WORLD";
Font font = new Font("arial", Font.LAYOUT_LEFT_TO_RIGHT, 30);
private int height;
private boolean gsh;
public Panel() {
System.out.println(this.getStringHeight(font, string));
}
public int getStringHeight(Font font, String string){
this.gsh = true;
repaint();
return this.height;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (this.gsh == true) {
Graphics2D g2d = (Graphics2D) g;
FontMetrics metrics = g2d.getFontMetrics(font);
this.height = (int)font.createGlyphVector(metrics.getFontRenderContext(), string).getVisualBounds().getHeight();
this.gsh = false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame display = new JFrame();
display.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
display.setSize(600,400);
display.add(new Panel());
display.setVisible(true);
}
}
repaint()不能正常工作。
repaint()没有做任何事情至少有两个原因:
RepaintManager
进行绘制请求,该绘制将调度稍后要完成的组件的绘制。因此,该方法返回时不会执行您的绘制代码,并且值始终为0。
一旦框架可见,面板将被绘制并且绘图代码将被执行。
我需要使用paintComponent来计算String Height,然后返回值。 import java.awt.Font;
绘画方法仅用于绘画。它不用于设置组件的属性。它不应计算高度或设置开关。
如果您尝试为组件进行某种大小计算,则应将逻辑添加到类的getPreferredSize()
方法中。这是根据组件的属性计算组件大小的方法。