在java中使用简单的画笔时出现问题。让我的清除按钮重绘的问题。阵列正在清除,但没有重新绘制。任何人都可以发现我的问题,或者是否有任何不同的方法为此代码生成一个清除按钮。
public class DrawingPanel extends JPanel {
private double x1=0;
private double x2=0;
private double y1=0;
private double y2=0;
private ArrayList<Shape> myArr = new ArrayList<Shape>();
//private ArrayList<Shape> clearMyArr = new ArrayList<Shape>();
ButtonPanel buttonPress;
public void paintComponent(Graphics g)
{
for (Shape i : myArr)
{
Graphics2D g2d = (Graphics2D)g;
g2d.draw(i);
}
/*for (Shape i : clearMyArr)
{
Graphics2D g2d = (Graphics2D)g;
g2d.draw(i);
} */
}
//inner class
class Listener1 extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
x1=e.getX();
y1=e.getY();
System.out.println("Mouse Pressed");
}
public void mouseReleased(MouseEvent e)
{
x2=e.getX();
y2=e.getY();
Shape shape = null;
if (buttonPress.buttonType.equals("Rectangle"))
{
// Rectangles cannot have a zero width or height
if (x1 != x2 || y1 != y2)
{
double width = Math.abs(x1 -x2);
double height = Math.abs(y1-y2);
shape = new Rectangle2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height);
}
}
if (buttonPress.buttonType.equals("Eclipse"))
{
double width = Math.abs(x1 -x2);
double height = Math.abs(y1-y2);
shape = new Ellipse2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height);;
}
if (buttonPress.buttonType.equals("Lines"))
{
shape = new Line2D.Double(x1, y1, x2, y2);
}
if (buttonPress.buttonType.equals("Clear"))
{
for( int i = 0;i <= myArr.size(); i++ )
{
System.out.println("ArrayList Size :"+myArr.size());
myArr.clear(); // clear all elements from arraylist
//clearMyArr.addAll(myArr);
System.out.println("ArrayList Size :"+myArr.size());
//myArr.removeAll();
revalidate();
repaint();
}
}
if (shape != null)
{
myArr.add(shape);
}
repaint();
}
}
//end of inner class
public DrawingPanel(ButtonPanel reference)
{
buttonPress = reference;
setBorder(BorderFactory.createLineBorder(Color.black,4));
addMouseListener(new Listener1());
}
}
答案 0 :(得分:7)
如果您忘记致电super.paintComponent(g);
,背景将无法清除,因此旧图片仍然可见。所有JButton和你添加的东西都不会被绘制出来。要解决这个问题,让面板首先绘制自己,然后你可以在它上面绘制你的东西。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);// <-- let panel draw itself
Graphics2D g2d = (Graphics2D)g;
for (Shape i : myArr)
{
g2d.draw(i);
}
}
这也有效(除了它不会绘制您使用DrawingPanel.add(..)
添加的小部件)。这是一个肮脏的黑客:
@Override
protected void paintComponent(Graphics g)
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.grey);
g2d.fillRect(0,0,this.getWidth(),this.getHeight()); //<-- clear the background
for (Shape i : myArr)
{
g2d.draw(i);
}
}
在听众中这就足够了。
if (buttonPress.buttonType.equals("Clear"))
{
myArr.clear();
repaint();
}
您不必致电revalidate();
。
答案 1 :(得分:2)
尝试从paintcomponent方法调用super.paintcomponent(g)。并确保您正在调用JPanel的重新验证和重绘方法。
答案 2 :(得分:1)
尝试调用repaint();您的JPanel。