我想存储固定坐标,然后递增坐标,直到它们到达屏幕边缘。这是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Name extends JPanel
{
int x, y, w, h, xdir, ydir;
public Name ()
{
}
public void paintComponent (Graphics g)
{
super.paintComponent (g);
g.drawLine(110+x, 300+y, 95+x, 400+y);
g.drawLine(110, 300, 123, 350);
g.drawLine(135, 300, 123, 350); //M
g.drawLine(135, 300, 150, 400);
g.drawOval (150, 300, 15, 15); // i
g.fillOval (150, 300, 15, 15);
g.drawLine (155, 320, 155, 400);
g.drawLine (172, 300, 172, 400); // k
g.drawLine (172, 350, 185, 300);
g.drawLine (172, 350, 185, 400);
g.drawLine (190, 360, 265, 360); // e
g.drawArc (190, 325, 75, 75, 360, 180);
g.drawArc (190, 330, 75, 75, 168, 180);
w = getSize ().width;
h = getSize ().height;
xdir = 1;
ydir = 1;
x = x + xdir;
y = y+ ydir;
if (x > w || x < 0)
{
xdir = -1 * xdir;
}
if (y > h || y < 0)
{
ydir = -1 * ydir;
}
repaint ();
MyLib.delay (25);
} // paint method
public static void main (String[] args)
{
JFrame frame = new JFrame ("NameBounce");
frame.getContentPane ().add (new Name ());
frame.setSize (500, 500);
frame.setVisible (true);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
} // main method
} // Name class
我尝试将坐标存储到数组列表中,但没有运气。
我一直在努力避免对整个程序进行硬编码。
使用类似 Path2D
的东西来定义要绘制的形状(您可以在单个Path2D
内绘制所有字母)
使用AffineTransform
来平移Graphics
的位置,并使用Graphics2D#draw
对Path2D
进行物理绘制
使用 Swing Timer
安排定期回拨,您可以在其中更新Path2D
的位置,并在组件上调用repaint
以触发更新
看
- 摇摆中的并发
- 如何使用摆动计时器
- 2D 图形
了解更多详情
不要在 paintComponent
方法(或事件调度线程的上下文中)调用Thread.sleep
或任何其他阻止进程,因为这将阻止 EDT 更新屏幕。
确保仅从 EDT 上下文中创建/更新 UI,有关更多详细信息,请参阅初始线程