【问题标题】:Getting the font metrics before the paint method id called在调用paint方法之前获取字体度量
【发布时间】:2015-06-04 16:29:40
【问题描述】:

您好,我正在创建一个新闻代码/文本滚动条。 我正在使用以下方法:

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Scroll1 extends JPanel{
    private int x;
    private int x2;
    private int y;
    private String text;
    final int startX=-100;
    public Scroll1(int startX)
    {
        x2=-650;
        x = 20;
        y=150;
        text= "Some Words and others, and now this must be a longer text that takes up the whole panel/ frame for this test to work   ";
    }
    @Override
    public void paint(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0, 0, 400, 300);
        g.setColor(Color.black);
        g.drawString(text, x, y);
        g.drawString(text, x2, y);
        FontMetrics fm= g.getFontMetrics(); 
        System.out.println(fm.stringWidth(text));;
    }

    public void start() throws InterruptedException{
        while(true){
            while(x<= 650){
                x++;
                x2++;
                y = getHeight()/2;
                repaint();
                Thread.sleep(10);
                if(x2>650)
                    x2=-650;
            }

            if(x>=0)
            {
                x=-650; 
            }
        }
    }
    public static void main(String[] args) {
        JFrame frame = new JFrame("Scrolling Panel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Scroll1 scrolling = new Scroll1(-100);

        frame.getContentPane().add(scrolling);
        frame.setSize(400, 300);
        frame.setVisible(true);
        try {
            scrolling.start();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

基本上它有两个正在绘制的字符串。一个从 0 位置开始,另一个从 -650 开始。我通过使用 paint 方法中的字体度量得到了 -650 数字。问题是我必须对这个数字进行硬编码,而且如果我使用不同的字符串,它具有不同的指标,它就行不通了。我尝试创建一个名为 width 的实例变量来存储字体度量,但似乎直到调用 paint 方法才输入宽度。无论如何我可以在开始绘制之前获得指标吗?

【问题讨论】:

    标签: java animation graphics fontmetrics


    【解决方案1】:

    我是否可以在开始绘制指标之前获得指标?

    只需在第一次调用paint时初始化变量(或者更好的是,paintComponent - 见下文) - 您可以使用布尔标志执行此操作,或将其值初始化为极端值并检查该值。

    int x = Integer.MIN_VALUE;
    ...
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        if ( x == Integer.MIN_VALUE ){
            x = -g.getFontMetrics().stringWidth(text);
        }
        ...
    }
    

    其他一些提示:

    1. 使用Swing Timer 执行动画,或确保使用SwingUtilities 将Swing 特定调用发送到EDT。
    2. 不要覆盖paint,而是覆盖paintComponent(并确保调用父方法super.paintComponent(g)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 2013-10-02
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多