Привет Я создаю тикер новостей/текстовый скроллер. Я использую следующий метод:Получение метрик шрифта перед идентификатором метода рисования с именем
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. В любом случае, я могу получить метрики, прежде чем она начнет ее рисовать?
прекрасно работает, я продолжаю использовать метод рисования, что не так с этим, и почему Шоуде я использовать paintComponent? –
'paint' делает несколько вещей, один из которых вызывает' paintComponent'. См. Https://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html. – copeg