Java 为什么重绘()不';这种方法不能正常工作

Java 为什么重绘()不';这种方法不能正常工作,java,swing,Java,Swing,该代码的建议是在您的需求中使用getStringHeight方法,而不使用Graphics g。然后我编写了这段代码,但是当它执行命令System.out.println(this.getStringHeight(font,string))返回值始终为0,因为repaint()无法正常工作。我想知道为什么以及如何修复它 基本上,在返回之前,我需要使用paintComponent来计算字符串高度,然后返回值 import java.awt.Font; import java.awt.FontMet

该代码的建议是在您的需求中使用getStringHeight方法,而不使用
Graphics g
。然后我编写了这段代码,但是当它执行命令
System.out.println(this.getStringHeight(font,string))返回值始终为0,因为
repaint()
无法正常工作。我想知道为什么以及如何修复它

基本上,在返回之前,我需要使用paintComponent来计算字符串高度,然后返回值

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()不起任何作用的原因至少有两个:

  • repaint()方法不会立即绘制组件。向
    重新喷漆管理器
    发出喷漆请求,该管理器将安排稍后对部件进行喷漆

  • 在这种情况下,代码在类的构造函数中执行。组件甚至还没有添加到框架中,因此RepaitManager将忽略该请求,因为面板只能绘制在可见的框架上

  • 因此,该方法在不执行绘制代码的情况下返回,且值始终为0

    一旦框架可见,将对面板进行喷漆,并执行喷漆代码

    我需要使用paintComponent来计算字符串高度,然后返回值。 导入java.awt.Font

    绘画方法仅用于绘画。它不用于设置组件的属性。不应计算高度或设置开关

    如果您试图对组件进行某种大小计算,那么应该将逻辑添加到类的
    getPreferredSize()
    方法中。这是一种基于零部件特性计算零部件尺寸的方法

    repaint()无法正常工作

    repaint()不起任何作用的原因至少有两个:

  • repaint()方法不会立即绘制组件。向
    重新喷漆管理器
    发出喷漆请求,该管理器将安排稍后对部件进行喷漆

  • 在这种情况下,代码在类的构造函数中执行。组件甚至还没有添加到框架中,因此RepaitManager将忽略该请求,因为面板只能绘制在可见的框架上

  • 因此,该方法在不执行绘制代码的情况下返回,且值始终为0

    一旦框架可见,将对面板进行喷漆,并执行喷漆代码

    我需要使用paintComponent来计算字符串高度,然后返回值。 导入java.awt.Font

    绘画方法仅用于绘画。它不用于设置组件的属性。不应计算高度或设置开关


    如果您试图对组件进行某种大小计算,那么应该将逻辑添加到类的
    getPreferredSize()
    方法中。这是一种基于组件属性计算组件大小的方法。

    不要调用类框架。首先,它不是一个框架,而是一个面板。其次,它令人困惑,因为已经是一个名为Frame的AWT类。第三,类名应该是描述性的,不要叫你的类框架。首先,它不是一个框架,而是一个面板。其次,它令人困惑,因为已经是一个名为Frame的AWT类。第三,类名应该是描述性的。我需要使用这个命令来获取字体高度(int)font.createGlyphVector(metrics.getFontRenderContext(),string.getVisualBounds().getHeight();FontMetrics需要Graphics2D,Graphics2D需要一个paintComponent,然后我想到了在需求中不使用Graphics g的情况下获取值,我尝试在构造函数类之外使用这个命令,这只在我放置线程时起作用。执行重绘的sleep(100),但这并不酷,所以我放弃了这一尝试,现在我必须在paintComponent中使用getStringHeight来获取大小值。@对于Saiken,
    我需要使用此命令来获取字体高度
    -不,至少在绘画方法中不需要。正如我所解释的,你的方法是完全错误的。你还说了为什么你认为你需要达到这个高度。我给了您一个可能的解决方案,这是在其他Swing组件中如何实现的。我需要使用此命令获取字体高度(int)font.createGlyphVector(metrics.getFontRenderContext(),string.getVisualBounds().getHeight();FontMetrics需要Graphics2D,Graphics2D需要一个paintComponent,然后我想到了在需求中不使用Graphics g的情况下获取值,我尝试在构造函数类之外使用这个命令,这只在我放置线程时起作用。执行重绘的sleep(100),但这并不酷,所以我放弃了这一尝试,现在我必须在paintComponent中使用getStringHeight来获取大小值。@对于Saiken,
    我需要使用此命令来获取字体高度
    -不,至少在绘画方法中不需要。正如我所解释的,你的方法是完全错误的。你还说了为什么你认为你需要达到这个高度。我给了您一个可能的解决方案,就是如何在其他Swing组件中实现它。