3

ボタンが押されたときにランダムな長方形を描く簡単なアニメーションを作成しようとしています。これまでのところ、ボタンを押すだけで長方形を作成できました。ボタンを押すと、複数のランダムな長方形が作成されるように、コードをさらに開発したいと思います。内部クラスに再描画を要求する for ループを作成しようとしましたが、それでも機能しませんでした。誰でも私を助けてください。

    public class TwoButtonsRandomRec {

    JFrame frame;
    private int width = 500;
    private int height = 500;
    private DrawPanel dp;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }


    public static void main (String[] args)
    {   
        TwoButtonsRandomRec test = new TwoButtonsRandomRec(); 
        test.go();
    }

    public void go()
    {   
        dp = new DrawPanel();

        JButton start = new JButton("Start");
        start.addActionListener(new startListener());
        JButton stop = new JButton("Stop");
        stop.addActionListener(new stopListener());

        frame = new JFrame();
        frame.setSize(getWidth(), getHeight());
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.NORTH, start);
        frame.getContentPane().add(BorderLayout.SOUTH, stop);
    }

    class startListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            frame.getContentPane().add(BorderLayout.CENTER, dp);
            frame.repaint();
            frame.getRootPane().revalidate();       
            for(int i=0; i<10; i++){
                dp.repaint();
            }
        }
    }

    class stopListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            System.out.println("stop");
        }
    }

    class DrawPanel extends JPanel{

        public void paintComponent(Graphics g){
            int w = 5+(int)(Math.random() * width-5);
            int h = 5+(int)(Math.random() * height-5);
            int maxX = width-w; // diffX & diffY are used to ensure that rectangle is
            int maxY = width-h; // draw completely inside the window
            int x = (int)(Math.random() * maxX);
            int y = (int)(Math.random() * maxY);
            Color color = new Color((int) (Math.random()*256), // random red
                    (int) (Math.random()*256), // random green
                    (int) (Math.random()*256));// random blue
            g.setColor(color);
            g.fillRect(x,y,w,h);
        }
    }
}
4

3 に答える 3

3

repaint()Swing に「時間ができたら、この領域を再描画してください」と指示するだけです。したがって、ループに四角形を追加し、反復ごとに repaint を呼び出すと、すべての四角形はループが終了し、アクション イベントが処理された後にのみ表示されます。

アニメーションを作成するには、別のスレッドでループする必要があります。これを行う最も簡単な方法は、Swing Timerを使用することです。[開始] ボタンが開始されると、ランダムな四角形を追加しrepaint()て X ミリ秒ごとに呼び出すタイマーを開始します。停止ボタンを押すと、タイマーが停止します。

于 2012-12-30T13:02:16.763 に答える
0

さて、ここで私はあなたのために短いEGを行いました。それはランダムな長方形、ランダムな画面位置にランダムな時間を表示します。(要件に応じて、ランダム化の独自の値と画面位置の最大境界を設定できます。

ここに画像の説明を入力してください

また、注意してください

            int i=(int)(Math.random()*10);

             int j=(int)(Math.random()*10);

             for(;i<j;i++)

時々私はjよりも大きいかもしれません。したがって、ループは1つまたは2つのクリックで機能しない可能性があります。必要に応じて変更してください。

動作するコードは次のとおりです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SimpleStamper extends JApplet {


  public void init() {

     Display display = new Display();
     setContentPane(display);
  }


  class Display extends JPanel implements MouseListener {

     Display() {

         setBackground(Color.black);
         addMouseListener(this);
     }

     public void mousePressed(MouseEvent evt) {


         if ( evt.isShiftDown() ) {

            repaint();
            return;
         }

         int x = evt.getX(); 
         int y = evt.getY();  

         Graphics g = getGraphics();  

            //***MODIFY THE FOLLOWING LINES****//   
             int i=(int)(Math.random()*10);
             int j=(int)(Math.random()*10);
             for(;i<j;i++)
             { g.setColor(Color.red);

               x=(int)(Math.random()*100);
               y=(int)(Math.random()*100);
             g.fillRect( x , y , 60, 30 );
             g.setColor(Color.black);
             g.drawRect(x , y , 60, 30 );}


         g.dispose();  
      } 
     public void mouseEntered(MouseEvent evt) { }
     public void mouseExited(MouseEvent evt) { }
     public void mouseClicked(MouseEvent evt) { }
     public void mouseReleased(MouseEvent evt) { }

   } 

  } 
于 2012-12-30T13:44:53.733 に答える
0

すべきことは、ループを paintComponent メソッド内に置き、ループ内で repaint を呼び出さないことです。したがって、paintComponent メソッドは次のようになります。

    public void paintComponent(Graphics g){
        for (int i = 0; i < 10; i++) {
        int w = 5+(int)(Math.random() * width-5);
            int h = 5+(int)(Math.random() * height-5);
            int maxX = width-w; // diffX & diffY are used to ensure that rectangle is
            int maxY = width-h; // draw completely inside the window
            int x = (int)(Math.random() * maxX);
            int y = (int)(Math.random() * maxY);
            Color color = new Color((int) (Math.random()*256), // random red
                    (int) (Math.random()*256), // random green
                    (int) (Math.random()*256));// random blue
            g.setColor(color);
            g.fillRect(x,y,w,h);
        }
    }

実行されたアクションは次のようになります。

public void actionPerformed(ActionEvent event){
    frame.getContentPane().add(BorderLayout.CENTER, dp);
    frame.repaint();
    frame.getRootPane().revalidate();       
    dp.repaint();
}
于 2012-12-30T13:12:45.617 に答える