Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新绘制方法每次重新绘制_Java_Applet_Japplet - Fatal编程技术网

Java 重新绘制方法每次重新绘制

Java 重新绘制方法每次重新绘制,java,applet,japplet,Java,Applet,Japplet,我有一个按钮网格,我想在任意两个单击的按钮之间画一条线,当我按下下一组按钮时,这条线应该保持不变。为此,我在applet中创建了以下paint和init方法,并覆盖了update方法,因为我们知道,重绘首先调用update(Graphics g)方法。upadate的默认实现是,它首先清除背景,然后调用paint方法,最终绘制图形。 因此,由于更新方法的默认实现,先前的图形将被删除。 如果重写给定的更新方法,则它将直接调用paint(g),因此不会清除早期图形 但前一行仍然消失。有两种方法可以做

我有一个按钮网格,我想在任意两个单击的按钮之间画一条线,当我按下下一组按钮时,这条线应该保持不变。为此,我在applet中创建了以下paint和init方法,并覆盖了update方法,因为我们知道,重绘首先调用update(Graphics g)方法。upadate的默认实现是,它首先清除背景,然后调用paint方法,最终绘制图形。 因此,由于更新方法的默认实现,先前的图形将被删除。 如果重写给定的更新方法,则它将直接调用paint(g),因此不会清除早期图形


但前一行仍然消失。

有两种方法可以做到这一点。要按自己的方式操作(例如,重写paint()方法),请尝试重写
paintComponent()
,而不是
paint()
()


一个更好的方法是使用一个透明的JPanel,在面板的顶部有一个带按钮的JPanel。绘图将在顶部窗格中完成。我认为这种方法更符合Swing理念,效果更好(图像缓存等导致的图形故障更少)。

您可以存储应该绘制的线条的数据结构,并在每次绘制时让它绘制适当的线条,而不是试图阻止它重新绘制。因此,单击两个按钮会将数据添加到数据结构中,用一对按钮指示应该在它们之间画一条线

因此,在
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;
    }
}

然后,在绘制方法中,可以循环线对象的arraylist,并绘制每个线对象。

请参见我添加的链接。paint()处理许多事情(边框、子组件…),您希望尽可能少地覆盖。但是,请注意swing会进行大量缓存,并且按钮可能会在悬停时重新绘制(取决于当前的LaF),因此最好使用JLayeredPane(再次,请参见链接)。由于
JApplet
不是
JComponent
的子类,因此无法覆盖
paintComponent
。谢谢保持这个答案,因为JLayerPane仍然可以工作(我认为)。JLayeredPane也是一种方法,但所有这一切的关键是将要绘制的对象存储在ArrayList中,以便在添加(删除)线时跟踪所有线。使用这种方法,您可能会在分层窗格中添加一个JPanel来进行自定义绘制,因此可以覆盖paintComponent()方法。您不应该重写顶级容器(如JFrame、JApplet等)的绘制方法。@tnt然后不要将JApplet用作主容器,使用JComponent或JPanel并将其添加到小程序中,您可以解耦代码,提高可重用性,并获得FreeDot override update(…)和paint(…)的双缓冲。这是使用AWT时的一种旧方法。使用Swing时,通过重写
paintComponent()
方法完成自定义绘制。@camickr无法重写paintComponent,因为JApplet不是JComponent的子类,如中所述comments@prtyush然后不要使用JApplet作为主容器,使用JComponent将其添加到applet中,这样你就可以得到免费的双缓冲是的,我还没有完成我的想法。您不应该在像JApplet(JFrame,JDialog)这样的顶级容器上进行自定义绘制。相反,您可以在JPanel上进行自定义绘制,并将面板添加到小程序(框架、对话框)。您将重写面板的paintComponent()方法。阅读1+上关于在列表中存储对象的Swing教程。有关使用此方法的工作示例,请参阅。@creditenson你会写代码吗?我不明白你想说什么?@prtyush,
你会写代码吗?
不要指望我们为你写代码。您是否阅读了上面给出的链接并测试了示例代码?花点时间理解这个概念,然后根据您的特定需求修改它。@prtyush了解如何将按钮输出到ArrayList中吗?这是相同的概念