Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java actionPerformed和ActionListener的问题_Java_Swing - Fatal编程技术网

Java actionPerformed和ActionListener的问题

Java actionPerformed和ActionListener的问题,java,swing,Java,Swing,我已经开始使用Java编程,但Swing有一个问题。我想在单击我的按钮后重复椭圆形动画przycisk。这就是为什么我创建RamkaAnimacjaKola mojeGUI=newramkaanimacjakola()在我的操作中执行。那么我应该改变什么呢 我调用Thread.sleap,因为这是我书中的一个例子。当我尝试只运行一次代码时,它就起作用了。这意味着没有操作侦听器和按钮przycisk源代码如下: package Kurs; import java.awt.BorderLayout

我已经开始使用Java编程,但Swing有一个问题。我想在单击我的按钮后重复椭圆形动画
przycisk
。这就是为什么我创建
RamkaAnimacjaKola mojeGUI=newramkaanimacjakola()在我的
操作中执行
。那么我应该改变什么呢

我调用
Thread.sleap
,因为这是我书中的一个例子。当我尝试只运行一次代码时,它就起作用了。这意味着没有操作侦听器和按钮
przycisk
源代码如下:

package Kurs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class RamkaAnimacjaKola implements ActionListener {

    JFrame ramka;
    Panel mojPanel;

    int x=40;
    int y=40;

    public void zacznijAnimacje(){
        mojPanel = new Panel();
        ramka= new JFrame();
        JButton przycisk= new JButton("repeat");
        ramka.getContentPane().add(BorderLayout.SOUTH, przycisk);
        przycisk.addActionListener(this);
        ramka.getContentPane().add(BorderLayout.CENTER, mojPanel);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setSize(300, 300);
        ramka.setVisible(true);

        for (int i=0 ; i <40 ;i++){
            x++;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }   
        }
        for (int i=0 ; i <40 ;i++){
            y++;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
        for (int i=0 ; i <40 ;i++){
            x--;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
        for (int i=0 ; i <40 ;i++){
            y--;
            ramka.repaint();
            try{
                Thread.sleep(50);
            } catch (Exception ex){ }
        }
    }

    public void actionPerformed(ActionEvent zdarzenie) {
        RamkaAnimacjaKola mojeGUI= new RamkaAnimacjaKola();
        mojeGUI.zacznijAnimacje();
    }

    class Panel  extends JPanel {
        public void paintComponent(Graphics g){
            g.setColor(Color.green);
            g.fillOval(x, y, 40, 40);
        }
    }
}

你能解释一下为什么它不工作吗?

你不应该在事件调度线程中做任何会阻止它的事情

除其他事项外,EDT负责处理重绘请求。任何阻止EDT处理这些事件的操作(如
Thread.sleep
)都会使其显示为应用程序已冻结。在这方面有许多优秀的例子

看一看和一些例子


您可能还想通读一下

请阅读关于如何使用swing编程的基本教程,然后是关于图形的教程(再多了解一点OOP也不错)。我认为,只要你没有掌握基本知识,那么纠正代码就没有多大意义。你昨天问了同样的问题,已经结束了。一些建议,但你显然没有考虑它们。我喜欢你命名类和变量的想法,但如果名称更有意义,遵循代码会很有帮助。请下次将代码翻译成英语。这段代码对大多数人来说都是不可读的。谢谢你的帮助,但是我能请你解释一下吗?或者你能对我的代码进行更正吗?我将非常感激,因为我是一个真正的初学者程序员,我花了很多时间试图找到这种行为的解释
package Kurs;

public class UruchomGUI {
/**
 * @param args
 */
public static void main(String[] args) {
        RamkaAnimacjaKola mojeGUI = new RamkaAnimacjaKola();
        mojeGUI.zacznijAnimacje();
    }
}