问题:正如您所看到的,当我们执行此代码并单击“圆形”按钮时,它会正确计算,但是当单击方形按钮时,它会再次正确计数,但再次点击圆形按钮然后先前的圆计数消失了,它再次从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>
*/
答案 0 :(得分:1)
我认为以前的开发人员在paint
上调用cont
是错误的。如果零件处理无论如何,这将自动完成,我将其替换为super.paint
我怀疑原作者无法弄清楚如何一次绘制多个形状。
paint
方法一次只能绘制一个形状。除非您将形状添加到某种列表中,然后循环,每次调用paint
方法时,每次调用paint
时,它都会删除以前的内容并仅绘制命名的形状。
您真的应该创建一个自定义组件,从JPanel
扩展,并覆盖其paintComponent
方法。在这里,你应该画出形状。
您对当前实现的问题是,可能会在控件上绘制形状,这很可能是不可取的