actionPerformed和ActionListener的问题

时间:2013-03-10 09:19:11

标签: java swing

我已经开始使用Java进行编程了,我有一个Swing问题。我想点击我的按钮przycisk后重复椭圆动画。这就是我在RamkaAnimacjaKola mojeGUI= new RamkaAnimacjaKola();中创建ActionPerformed的原因。那我应该改变什么呢?

我致电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);
        }
    }
}

我使用我的测试类启动此代码:

package Kurs;

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

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

1 个答案:

答案 0 :(得分:2)

您应该在事件调度线程中不执行任何阻止它的操作。

除其他事项外,EDT负责处理重绘请求。你做的任何阻止EDT处理这些事件的事情(如Thread.sleep)都会使你的应用程序冻结。 SO上有很多优秀的例子。

查看Multiple bouncing balls thread issueJava Bouncing Ball以及the images are not loading以获取一些示例......

您可能还希望阅读Concurrency in Swing