0

質問 :ご覧のとおり、このコードを実行して円ボタンをクリックすると正しくカウントされますが、正方形のボタンをクリックすると再び正しくカウントされますが、もう一度円のボタンをクリックすると、以前の円のカウントが消えてしまいます。再び1から始まります。

どこに問題がありますか:少し検索した後、ContentPane オブジェクトで呼び出されたメソッドgetGraphics()が問題を引き起こしていることがわかりました。それを変更しようとしましたが、プログラムは実行されません。問題があります。

編集:mKorbelが言ったことをしました

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

public class CountShapes1 extends JApplet implements ActionListener
{
    Container cont;
    JPanel p;

    JLabel lblCount;
    JButton btCircle,btSquare;

    boolean blnCircle,blnSquare;
    int count=0;
    String shape="";

    public void init() 
    {
        cont=getContentPane();

        lblCount=new JLabel("Shape Count : 0",JLabel.CENTER);
        lblCount.setFont(new Font("Arial",Font.BOLD,18));
        cont.add(lblCount,BorderLayout.NORTH);

        btCircle=new JButton("Circle");
        btSquare=new JButton("Square");

        btCircle.addActionListener(this);
        btSquare.addActionListener(this);

        p=new JPanel();
        p.add(btCircle);
        p.add(btSquare);

        cont.add(p,BorderLayout.SOUTH);
    }

     public void actionPerformed(ActionEvent ae)
     {
        if(ae.getSource()==btCircle)
        {
            if(blnSquare==true)
            {
                blnSquare=false;
                count=0;
            }

            blnCircle=true;
            shape="CIRCLE";
            count++;

        lblCount.setText(shape+" Count : "+count);
        repaint();
    }

    if(ae.getSource()==btSquare)
    {
        if(blnCircle==true)
        {
                blnCircle=false;
                count=0;
        }
        blnSquare=true;
        shape="SQUARE";
        count++;

        lblCount.setText(shape+" Count : "+count);
        repaint();
    }
}

    public void paint(Graphics g)
   {
       cont.paint(cont.getGraphics());

       int x=10,y=30,w=30,h=30;
       if(shape.equals("CIRCLE") || shape.equals("SQUARE"))
       {
         for(int i=0;i<count;i++)
         {
            if(shape.equals("CIRCLE"))
            {
                g.drawOval(x,y,w,h);
            }
            else
            {
                g.drawRect(x,y,w,h);
            }
             x+=40;
                if(x>=getWidth()-30)
                {
                    x=10;
                    y+=40;
                }
         }  //for -loop finished

      }  // if-finished
   } // paint() finished
 } // class finished

/*
   <applet code="CountShapes1" width=500 height=500>
   </applet>
*/
4

1 に答える 1

1

paint前の開発者に電話するのは間違いだと思いますcont。これは、部品プロセスがとにかく部品として自動的に行われます。私はそれを次のように置き換えますsuper.paint

元の作者は、一度に複数の図形をペイントする方法を理解できなかったのではないかと思います。

このpaint方法では、一度に 1 つのシェイプしかペイントできません。何らかの種類のリストに形状を追加していない限り、メソッドが呼び出されるたびにループし、paintメソッドが呼び出されるたびにpaint、以前のコンテンツが消去され、名前付きの形状のみが描画されます。

カスタムコンポーネントを作成して、フォームを拡張し、そのメソッドJPanelをオーバーライドする必要があります。paintComponentこれで、図形をペイントする必要があります。

現在の実装で発生する問題は、形状がコントロールを塗りつぶす可能性があることです。これはおそらく望ましくないでしょう

于 2013-03-24T07:54:32.930 に答える