0

質問はすべてタイトルにあります:)。コードの何が問題になっているのか、なぜアプレットに円が描画されないのかわかりません。手伝ってもらえますか?

これが私のコードです:

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Event;

public class BouncingBall extends JApplet {
    private static final long serialVersionUID = 1L;
    boolean b = true;
    long speed = 50;
    int pos = 250;

    public void init(){
        setSize(500,500);
    }
    public boolean mouseDown(Event e, int x, int y)
    {


        if(y>250)
        {
            speed = speed - 10;
        }
        else
        {
            speed = speed + 10;
        }

        repaint();
        return true;
    }
    public void paintComponents(Graphics g)
    {
        g.drawOval(250,pos,100,100);
        if(speed <= 20)
        {
            speed++;
            repaint();
        }
        try
        {
            Thread.sleep(speed);
        }
        catch(InterruptedException e){e.printStackTrace();}
        if(pos>=400)
        {
            b = false;
        }
        if(pos<=100)
        {
            b = true;
        }
        if(b==true)
        {
            pos = pos +5;
        }
        else
        {
            pos = pos -5;
        }
        repaint();
    }
}

エマルジョン

4

3 に答える 3

3

paintComponentsの代わりにメソッドが呼び出されpaintComponentます。複数形です。@Overrideこのようなエラーを発見するには、オーバーライドするメソッドにアノテーションを追加することをお勧めします。ここになります

@Override
public void paintComponents(Graphics g)

オーバーライドするメソッドがない場合、コンパイラはエラーを出します。

于 2012-09-04T06:58:14.780 に答える
3

回答の準備をしている間、一読してください

わかった。あなたが正しくした唯一のことについては、JApplet

あなたの「ペイント」方法は完全に混乱しています...

public void paintComponents(Graphics g) {
   // Where's the super call???  All paint methods have a super
   // if you don't call it, expect really bad things to happen...
   if(speed <= 20)
    {
        speed++;
        // Don't do this
        repaint();
    }
    try
    {
        // NEVER, EVER do this, EVER
        Thread.sleep(speed);
    }
    catch(InterruptedException e){e.printStackTrace();}

    // These choices should be made else where.
    if(pos>=400)
    {
        b = false;
    }
    if(pos<=100)
    {
        b = true;
    }
    if(b==true)
    {
        pos = pos +5;
    }
    else
    {
        pos = pos -5;
    }
    // NEVER DO THIS IN A PAINT METHOD...
    repaint();

すでに指摘したように、mouseDownメソッドを使用せず、MouseListener代わりに使用してください

すでに指摘したように、トップレベルのコンテナ(JAppletまたは任意のタイプのウィンドウやフレーム)にペイントするのではなく、代わりにカスタムコンポーネントを使用してください。

public class BouncingBall extends JApplet {

    private static final long serialVersionUID = 1L;

    public void init() {
        setSize(500, 500);
        setLayout(new BorderLayout());
        add(new BouncyPane());
    }

    protected class BouncyPane extends JPanel {

        private boolean b = true;
        private int speed = 50;
        private int pos = 250;
        private Timer timer;
        private int amount = 10;

        public BouncyPane() {
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {

                    if (speed > 250) {
                        amount = -10;
                    } else if (speed <= 0) {
                        amount = 10;
                    }

                    speed += amount;
                    timer.stop();
                    timer.setDelay(speed);
                    timer.restart();

                    repaint();
                }
            });

            timer = new Timer(speed, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (pos >= 400) {
                        b = false;
                    }
                    if (pos <= 100) {
                        b = true;
                    }
                    if (b == true) {
                        pos = pos + 5;
                    } else {
                        pos = pos - 5;
                    }

                    repaint();

                }
            });

            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
            g.setColor(Color.RED);
            g.drawOval(250, pos, 100, 100);
        }
    }
}

上記のすべてのリンクを読んでください。コード内の問題のある領域が強調表示されます。

于 2012-09-04T09:35:08.377 に答える
2

トップレベルのコンテナにペイントしないでください!

JPanel代わりに、 (または)を追加し、アプレットで行われるようにメソッドをJComponentオーバーライドします。paintComponent(Graphics)アプレットで直接実行されている場合、オーバーライドするメソッドはですpaint(Graphics)

于 2012-09-04T07:18:36.073 に答える