Java JFrame(Swing)更新(图形)错误

Java JFrame(Swing)更新(图形)错误,java,graphics,jframe,Java,Graphics,Jframe,我有一个带little Rect的小游戏,它正在移动,我需要在我的onUpdate方法中更新Graphics,每50毫秒调用一次。但是当我这样做时,我的按钮和文本字段都会闪烁 有人知道如何修复它吗?下面是一个如何通过计时器更新JPanel的示例 import java.awt.Color; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt

我有一个带little Rect的小游戏,它正在移动,我需要在我的
onUpdate
方法中更新
Graphics
,每50毫秒调用一次。但是当我这样做时,我的
按钮和
文本字段都会闪烁


有人知道如何修复它吗?

下面是一个如何通过计时器更新
JPanel
的示例

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MainClass extends JPanel {

    static JFrame frame = new JFrame("Oval Sample");
    static MainClass panel = new MainClass(Color.CYAN);
    static Color colors[] = {Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW};
    static Color color;
    static int step = 0;

    public MainClass(Color color) {
        this.color = color;
    }

    final static Timer tiempo = new Timer(500, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
//            paintComponent();
            System.out.println("Step: " + step++);
            if (step % 2 == 0) {
                color = Color.DARK_GRAY;
            } else {
                color = Color.BLUE;
            }
            panel.repaint();
        }
    });

    @Override
    public void paintComponent(Graphics g) {
        int width = getWidth();
        int height = getHeight();
        g.setColor(color);
        g.drawOval(0, 0, width, height);
    }

    public static void main(String args[]) {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(2, 2));
        panel = new MainClass(colors[2]);
        frame.add(panel);
        frame.setSize(300, 200);
        frame.setVisible(true);
        tiempo.start();
    }
}
当我这样做的时候。更新(我的图形)我所有的按钮和文本字段都会闪烁

不要直接调用
update(…)
。这不是定制绘画的方式

相反,当您进行自定义绘制时,会覆盖JPanel的
paintComponent(…)
方法:

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);

    //  add your custom painting here
}
我有一个小游戏,有一个小矩形,正在移动

如果需要动画,则应使用
摆动计时器
来安排动画。然后,当计时器触发时,调用自定义类上的方法来更改矩形的位置,然后调用
repaint()
。这将导致面板重新喷漆

读这本书。以下章节介绍:

  • 表演定制绘画
  • 如何使用摆动计时器

  • 从基本示例开始。

    您应该覆盖
    paintComponent(…)
    。这不起作用,因为Paint方法仅在我单击下一轮按钮时更新//我与Jpanel交互,但我希望它在我不做任何事的情况下更新