Java Swing 基本动画问题
Java Swing basic animation issue
我刚刚开始学习 GUI 和 Swing,并决定编写一个我在教科书中找到的程序来显示一个彩色矩形,并使其在屏幕上看起来像是在缩小。
下面是我写的代码,我的问题是矩形显示在屏幕上,但没有每 50 毫秒重新绘制成更小的尺寸。谁能指出我哪里出了问题?
非常感谢
import javax.swing.*;
import java.awt.*;
public class Animate {
int x = 1;
int y = 1;
public static void main(String[] args){
Animate gui = new Animate();
gui.start();
}
public void start(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Rectangles rectangles = new Rectangles();
frame.getContentPane().add(rectangles);
frame.setSize(500,270);
frame.setVisible(true);
for(int i = 0; i < 100; i++,y++,x++){
x++;
rectangles.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class Rectangles extends JPanel {
public void paintComponent(Graphics g){
g.setColor(Color.blue);
g.fillRect(x, y, 500-x*2, 250-y*2);
}
}
}
- 您应该重绘整个
JFrame
(或者您的图形所在的 JPanel)。
- 您不必调用
x++
两次,而是调用 x+=2
将您的代码更改为此(有效,我还修复了缩进):
import javax.swing.*;
import java.awt.*;
public class Animate {
int x = 1;
int y = 1;
public static void main(String[] args) {
Animate gui = new Animate();
gui.start();
}
public void start() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Rectangles rectangles = new Rectangles();
frame.getContentPane().add(rectangles);
frame.setSize(500, 270);
frame.setVisible(true);
for (int i = 0; i < 100; i++, y++, x += 2) {
frame.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class Rectangles extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.fillRect(x, y, 500 - x * 2, 250 - y * 2);
}
}
}
the rectangle displays on the screen, but is not repainted to a smaller size every 50ms
自定义绘画时的基本代码应该是:
protected void paintComponent(Graphics g)
{
super.paintComponent(g); // to clear the background
// add custom painting code
}
如果您不清除背景,那么旧画仍然存在。所以画小一点的东西不会有什么不同。
为了更好的代码结构,x/y 变量应该在 Rectangles
class 中定义。然后你应该创建一个像 decreaseSize()
这样的方法,它也在你的 Rectangles
class 中定义。此代码将更新 x/y 值,然后对其自身调用重绘。所以你的动画代码只会调用 decreaseSize()
方法。
我刚刚开始学习 GUI 和 Swing,并决定编写一个我在教科书中找到的程序来显示一个彩色矩形,并使其在屏幕上看起来像是在缩小。
下面是我写的代码,我的问题是矩形显示在屏幕上,但没有每 50 毫秒重新绘制成更小的尺寸。谁能指出我哪里出了问题?
非常感谢
import javax.swing.*;
import java.awt.*;
public class Animate {
int x = 1;
int y = 1;
public static void main(String[] args){
Animate gui = new Animate();
gui.start();
}
public void start(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Rectangles rectangles = new Rectangles();
frame.getContentPane().add(rectangles);
frame.setSize(500,270);
frame.setVisible(true);
for(int i = 0; i < 100; i++,y++,x++){
x++;
rectangles.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class Rectangles extends JPanel {
public void paintComponent(Graphics g){
g.setColor(Color.blue);
g.fillRect(x, y, 500-x*2, 250-y*2);
}
}
}
- 您应该重绘整个
JFrame
(或者您的图形所在的 JPanel)。 - 您不必调用
x++
两次,而是调用x+=2
将您的代码更改为此(有效,我还修复了缩进):
import javax.swing.*;
import java.awt.*;
public class Animate {
int x = 1;
int y = 1;
public static void main(String[] args) {
Animate gui = new Animate();
gui.start();
}
public void start() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Rectangles rectangles = new Rectangles();
frame.getContentPane().add(rectangles);
frame.setSize(500, 270);
frame.setVisible(true);
for (int i = 0; i < 100; i++, y++, x += 2) {
frame.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class Rectangles extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.fillRect(x, y, 500 - x * 2, 250 - y * 2);
}
}
}
the rectangle displays on the screen, but is not repainted to a smaller size every 50ms
自定义绘画时的基本代码应该是:
protected void paintComponent(Graphics g)
{
super.paintComponent(g); // to clear the background
// add custom painting code
}
如果您不清除背景,那么旧画仍然存在。所以画小一点的东西不会有什么不同。
为了更好的代码结构,x/y 变量应该在 Rectangles
class 中定义。然后你应该创建一个像 decreaseSize()
这样的方法,它也在你的 Rectangles
class 中定义。此代码将更新 x/y 值,然后对其自身调用重绘。所以你的动画代码只会调用 decreaseSize()
方法。