为什么repaint()在此方法中无法正常工作

时间:2018-03-04 03:56:17

标签: java swing

此代码的提议使用方法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);

    }

}

1 个答案:

答案 0 :(得分:2)

  

repaint()无法正常工作。

repaint()没有做任何事情至少有两个原因:

  1. repaint()方法不会立即绘制组件。对RepaintManager进行绘制请求,该绘制请求将安排稍后完成组件的绘制。

  2. 在这种情况下,您的代码将在您的类的构造函数中执行。该组件尚未添加到框架中,因此RepaintManager将忽略该请求,因为面板只能在可见框架上绘制。

  3. 因此,方法返回时不会执行绘制代码,值将始终为0.

    一旦框架可见,面板将被绘制,绘画代码将被执行。

      

    我需要使用paintComponent来计算String Height,然后返回值。   import java.awt.Font;

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

    如果您尝试对组件进行某种大小计算,则应将逻辑添加到类的getPreferredSize()方法中。这是根据组件的属性计算组件大小的方法。