2015-06-04 8 views
0

Привет Я создаю тикер новостей/текстовый скроллер. Я использую следующий метод:Получение метрик шрифта перед идентификатором метода рисования с именем

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. Я получил номер -650, используя метрики шрифтов внутри метода рисования. Проблема в том, что мне пришлось жестко кодировать этот номер, и если бы я сделал другую строку с разными показателями, это не сработало. Я попытался создать переменную экземпляра с именем width, которая хранит метрики шрифта, но кажется, что ширина не вводится до тех пор, пока не будет вызван метод paint. В любом случае, я могу получить метрики, прежде чем она начнет ее рисовать?

ответ

1

Есть ли способ получить метрики, прежде чем он начнет ее рисовать?

Просто инициализировать переменную в первом вызове рисовать (или еще лучше, 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 для выполнения анимации, или обязательно отправлять Свинг конкретные вызовы в EDT, используя SwingUtilities.
  2. Не перегружайте paint, а переопределить paintComponent (и обязательно вызвать родительский метод super.paintComponent(g))
+0

прекрасно работает, я продолжаю использовать метод рисования, что не так с этим, и почему Шоуде я использовать paintComponent? –

+0

'paint' делает несколько вещей, один из которых вызывает' paintComponent'. См. Https://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html. – copeg