-3

Java を使用してプログラミングを始めましたが、Swing で 1 つの問題があります。ボタンをクリックした後、楕円形のアニメーションを繰り返したいと思います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();
    }
}

なぜうまくいかないのか説明してもらえますか?

4

1 に答える 1

2

それをブロックするイベントディスパッチスレッドでは何もしないでください。

EDT は、とりわけ再描画要求の処理を担当します。EDT がこれらのイベントを処理するのを妨げる操作 ( などThread.sleep) を行うと、アプリケーションがフリーズしたように見えます。SOには多くの優れた例があります。

複数の跳ねるボールのスレッドの問題Java Bounce Ballを見てください。いくつかの例では、画像が読み込まれていません...

また、Swing での同時実行についてもお読みください。

于 2013-03-10T09:36:40.477 に答える