我有一个按钮网格,我想在任意两个单击的按钮之间绘制一条线,当我按下下一组按钮时该线应该停留。为此,我在applet中制作了以下paint和init方法,并且还覆盖了更新方法,因为我们知道首先重绘调用update(Graphics g)方法。 upadate的默认实现是它首先清除背景然后调用最终完成绘图的paint方法。 因此,由于更新方法的默认实现,先前的绘图被擦除。 如果我们覆盖给定的更新方法,那么它直接调用paint(g),因此不会清除先前的绘图。
但是前一行仍然消失了。
答案 0 :(得分:4)
您可以存储应该绘制的线条的数据结构,而不是试图阻止它重新绘制,每次绘制时,都要绘制相应的线条。因此,单击两个按钮会将数据添加到数据结构中,指示应该在一对按钮之间绘制一条线。
因此,在actionPerformed
侦听器中,您将xy坐标存储在数据结构中,而不是设置这些实例变量。
数据结构可以是一个简单的ArrayList,包含您创建的简单Line类。 Line类只包含两组坐标:
class Line {
private int x1;
private int x2;
private int y1;
private int y2;
public Line(x1, y1, x2, y2) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
}
然后在你的paint方法中,你可以循环遍历Line对象的arraylist,并绘制每个对象。
答案 1 :(得分:0)
有两种方法可以做到这一点。为了顺利(例如覆盖paint()方法),请尝试覆盖paintComponent()
而不是paint()
(more)。
更好的方法是使用JLayeredPane,并使用按钮在面板顶部放置透明的JPanel。图纸将在顶部窗格中完成。我认为这种方法更符合Swing理念,并且可以更好地工作(由于图像缓存等原因,图形故障减少)。