试图理解已经制作的JApplet代码

时间:2013-03-24 07:27:48

标签: java swing graphics actionlistener japplet

问题:正如您所看到的,当我们执行此代码并单击“圆形”按钮时,它会正确计算,但是当单击方形按钮时,它会再次正确计数,但再次点击圆形按钮然后先前的圆计数消失了,它再次从1开始。

问题出在哪里:经过一些搜索后,我发现在ContentPane对象上调用的方法 getGraphics()导致了问题,我尝试更改它,但程序甚至没有运行,如果它运行,那么所有GUI组件都会有问题。

编辑: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>
*/

1 个答案:

答案 0 :(得分:1)

我认为以前的开发人员在paint上调用cont是错误的。如果零件处理无论如何,这将自动完成,我将其替换为super.paint

我怀疑原作者无法弄清楚如何一次绘制多个形状。

paint方法一次只能绘制一个形状。除非您将形状添加到某种列表中,然后循环,每次调用paint方法时,每次调用paint时,它都会删除以前的内容并仅绘制命名的形状。

您真的应该创建一个自定义组件,从JPanel扩展,并覆盖其paintComponent方法。在这里,你应该画出形状。

您对当前实现的问题是,可能会在控件上绘制形状,这很可能是不可取的