如何在java中自动移动圆?

如何在java中自动移动圆?,java,swing,animation,jframe,awt,Java,Swing,Animation,Jframe,Awt,我不熟悉JavaGUI,正在努力学习它。我想在屏幕上自动移动一个圆圈(即不通过按任何键或执行任何其他操作)。我通过做一些动作找到了移动它的方法,但这不是我需要的。谁能告诉我最简单的方法吗 我想在以下代码中删除动作侦听器,以便圆圈自动移动: public class MyFirstGraphics extends JFrame { int x = 100; int y = 100; MyFirstGraphics() { super("Circle");

我不熟悉JavaGUI,正在努力学习它。我想在屏幕上自动移动一个圆圈(即不通过按任何键或执行任何其他操作)。我通过做一些动作找到了移动它的方法,但这不是我需要的。谁能告诉我最简单的方法吗

我想在以下代码中删除动作侦听器,以便圆圈自动移动:

public class MyFirstGraphics extends JFrame {

    int x = 100;
    int y = 100;

    MyFirstGraphics() {
        super("Circle");
        setSize(800, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.pink);
        JButton f = new JButton("circle");
        f.addActionListener(new re());
        add(f, BorderLayout.NORTH);
    }

    private class re implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            for (int i = 1; i < 50; i++) {
                x++;
                y++;
                repaint();
            }
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawOval(x, y, 100, 100);
    }

    public static void main(String[] args) {
        MyFirstGraphics l = new MyFirstGraphics();
        l.setVisible(true);
    }
}
公共类MyFirstGraphics扩展JFrame{
int x=100;
int y=100;
MyFirstGraphics(){
超级(“圆圈”);
设置大小(800800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(颜色为.pink);
JButton f=新JButton(“圆”);
f、 addActionListener(新的re());
添加(f,边界布局。北);
}
私有类重新实现ActionListener{
已执行的公共无效操作(操作事件e){
对于(int i=1;i<50;i++){
x++;
y++;
重新油漆();
}
}
}
公共空间涂料(图g){
超级油漆(g);
g、 牵引椭圆(x,y,100100);
}
公共静态void main(字符串[]args){
MyFirstGraphics l=新的MyFirstGraphics();
l、 setVisible(真);
}
}

若要设置该代码的动画,请使用基于Swing的
计时器
,并将
re
ActionListener
作为构造函数中的一个参数(另一个参数是延迟)


有关详细信息和工作示例,请参见。

让我们从动画是随时间变化的幻觉这一事实开始。此外,Swing是一个单线程环境。您不能“阻止”Swing线程(也称为事件调度线程)并让它绘制更新,您需要某种方法定期安排更新,以便应用更改,然后重新绘制更改

所以您的第一个问题是您的
操作执行
方法

for (int i = 1; i < 50; i++) {
    x++;
    y++;
    repaint();
}
for(int i=1;i<50;i++){
x++;
y++;
重新油漆();
}
基本上,唯一可以上漆的是150x150的球,中间没有其他东西可以上漆

相反,你需要把它改成更像

public void actionPerformed(ActionEvent e) {
    if (x < 150 && y < 150) {
        x++;
        y++;
    } else {
        ((Timer)e.getSource()).stop();
    }
    repaint();
}
public void actionPerformed(ActionEvent e){
如果(x<150&&y<150){
x++;
y++;
}否则{
((计时器)e.getSource()).stop();
}
重新油漆();
}
看看:

欲知详情

基本的“弹性”球示例

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BounceyDot {

    public static void main(String[] args) {
        new BounceyDot();
    }

    public BounceyDot() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private int x = 0;
        private int y = 100;
        private int radius = 20;
        private int xDelta = 2;

        public TestPane() {
            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    x += xDelta;
                    if (x + (radius * 2) > getWidth()) {
                        x = getWidth() - (radius * 2);
                        xDelta *= -1;
                    } else if (x < 0) {
                        x = 0;
                        xDelta *= -1;
                    }
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillOval(x, y - radius, radius * 2, radius * 2);
        }
    }

}

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类弹跳点{
公共静态void main(字符串[]args){
新弹跳点();
}
公共弹跳点(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私有整数x=0;
私人int y=100;
私有整数半径=20;
私有int xDelta=2;
公共测试窗格(){
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
x+=xDelta;
如果(x+(半径*2)>getWidth()){
x=getWidth()-(半径*2);
xDelta*=-1;
}else如果(x<0){
x=0;
xDelta*=-1;
}
重新油漆();
}
});
timer.start();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.RED);
g、 圆角(x,y-半径,半径*2,半径*2);
}
}
}

SO上有很多示例,例如(滚动到底部)。你还应该看一看,关于如何实现的细节,动画也不是一个简单的主题(有趣,但不简单)。上面评论中的链接示例与Swing中的示例一样简单:“我找到了一种通过执行某些操作来移动它的方法,但这不是我所需要的。”为了更快地获得更好的帮助,请发布一个(最简单的完整且可验证的示例)。@AndrewThompson发布了一个示例代码。对代码块使用一致且逻辑性强的缩进。代码的缩进旨在帮助人们理解程序流程。谢谢!那正是我要找的东西。再次感谢。非常感谢。真的很有帮助。