在调用 paint 方法之前获取字体指标
Getting the font metrics before the paint method id called
您好,我正在创建新闻滚动条/文本滚动条。
我正在使用以下方法:
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 方法之前不会输入宽度。无论如何我可以在开始绘制之前获得指标吗?
Is there anyway I can get the metrics before it starts drawing it?
只需在第一次调用 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);
}
...
}
一些其他提示:
- 使用 Swing Timer 执行动画,或者确保使用
SwingUtilities
将 Swing 特定调用分派给 EDT。
- 不要覆盖
paint
,而是覆盖 paintComponent
(并且一定要调用父方法 super.paintComponent(g)
)
您好,我正在创建新闻滚动条/文本滚动条。 我正在使用以下方法:
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 方法之前不会输入宽度。无论如何我可以在开始绘制之前获得指标吗?
Is there anyway I can get the metrics before it starts drawing it?
只需在第一次调用 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);
}
...
}
一些其他提示:
- 使用 Swing Timer 执行动画,或者确保使用
SwingUtilities
将 Swing 特定调用分派给 EDT。 - 不要覆盖
paint
,而是覆盖paintComponent
(并且一定要调用父方法super.paintComponent(g)
)