Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 Jpanel错误重新绘制_Java_Swing_Jpanel - Fatal编程技术网

Java Jpanel错误重新绘制

Java Jpanel错误重新绘制,java,swing,jpanel,Java,Swing,Jpanel,我已经创建了自己的扩展JPanel,用户可以在上面签名,然后保存签名并从面板中删除: public class PanelParaFirmar extends JPanel { private MouseHandler mouseHandler = new MouseHandler(); private int index = 0; private Point[] arr = new Point[100000]; public PanelParaFirmar() {

我已经创建了自己的扩展JPanel,用户可以在上面签名,然后保存签名并从面板中删除:

public class PanelParaFirmar extends JPanel
{
private MouseHandler mouseHandler = new MouseHandler();
private int index = 0;
private Point[] arr = new Point[100000];

    public PanelParaFirmar()
    {
        this.setBackground(Color.WHITE);
        this.addMouseListener(mouseHandler);
        this.addMouseMotionListener(mouseHandler);
    }

    protected void paintComponent(Graphics g)
    {
        this.paintComponents(g);
        for (int i = 0; i < index - 1; i++)
            g.drawLine(arr[i].x, arr[i].y, arr[i + 1].x, arr[i + 1].y);
    }

    private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
        arr[index] = new Point(e.getX(), e.getY());
        index++;
        repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            arr = new Point[100000];
            index = 0;
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            //updateUI();
            //save();
            arr[index] = new Point(e.getX(), e.getY());
            index++;
            repaint();
        }

        public void mouseExited(MouseEvent e) {}
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {}
    }

};
公共类PanelParaFirmar扩展了JPanel
{
private MouseHandler MouseHandler=新的MouseHandler();
私有整数指数=0;
专用点[]arr=新点[100000];
公共事务委员会
{
这个.背景(颜色.白色);
这是addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
}
受保护组件(图形g)
{
这是指组件(g);
对于(int i=0;i
在单击之前,一切正常:

但当我开始签名时,它会重新绘制根窗格:


如何仅绘制线条?

除了应该覆盖
paintComponent
而不是
paintComponents
,并调用其
super
实现之外,下面是如何为一个签名管理多行

创建一个行列表(行只不过是点列表)来表示签名

按下鼠标后,向列表中添加新行,并将当前点添加到此行

拖动鼠标时,将当前点添加到当前线

最后,绘制方法将一条接一条地绘制每条线,而不会在它们之间进行连接:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PanelParaFirmar extends JPanel {
    private final MouseHandler mouseHandler = new MouseHandler();

    private final List<List<Point>> lines = new ArrayList<>();
    private List<Point> currentLine;

    public static void main(final String[] args) {

        JFrame fr = new JFrame();
        fr.setSize(400, 200);
        fr.getContentPane().add(new PanelParaFirmar());
        fr.setVisible(true);
    }

    public PanelParaFirmar() {
        this.setBackground(Color.WHITE);
        this.addMouseListener(mouseHandler);
        this.addMouseMotionListener(mouseHandler);
    }

    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);

        for (List<Point> line : lines) {

            for (int i = 0; i < line.size() - 1; i++) {

                Point thisPoint = line.get(i);
                Point nextPoint = line.get(i + 1);

                g.drawLine(thisPoint.x, thisPoint.y, nextPoint.x, nextPoint.y);

            }
        }

    }

    private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(final MouseEvent e) {

            currentLine = new ArrayList<Point>();
            currentLine.add(new Point(e.getX(), e.getY()));

            lines.add(currentLine);

            repaint();
        }

        @Override
        public void mouseDragged(final MouseEvent e) {

            Point p = new Point(e.getX(), e.getY());
            currentLine.add(p);
            repaint();
        }


    }

}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类PanelParaFirmar扩展了JPanel{
private final MouseHandler MouseHandler=新的MouseHandler();
私有最终列表行=新的ArrayList();
私有列表行;
公共静态void main(最终字符串[]args){
JFrame fr=新JFrame();
fr.setSize(400200);
fr.getContentPane().add(新的PanelParaFirmar());
fr.setVisible(真);
}
公共事务委员会{
这个.背景(颜色.白色);
这是addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
}
受保护组件(最终图形g){
超级组件(g);
用于(列表行:行){
对于(int i=0;i

另外请注意,由于您使用的是
MouseAdapter
,因此不必实现不需要的方法(如
mouseClicked
)。

尝试调用
super.paintComponent(g)
,而不是
this.paintComponents(g)
(注意,paintComponent没有)。谢谢,但现在,当我释放鼠标按钮时,它会在下一个签名中创建一个新行,一些签名有多行。我怎样才能删除所有的行呢?你是说你接受有几行的签名吗?是的,有时候签名需要做一行,然后“举起笔”再做第二行。所以你决定签名结束的事件不应该是鼠标松开,而应该是某个给定按钮上的动作(例如,在您的GUARDAR按钮上)。谢谢!现在我需要一个方法来删除所有行。当一个人在上面签名时,我将清空所有内容并允许用户再次签名。只需添加一个方法,该方法执行
lines=new ArrayList()
然后
repaint();