【问题标题】:Jpanel error repaintingJpanel错误重绘
【发布时间】:2018-05-11 08:51:22
【问题描述】:

我已经创建了自己的扩展 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) {}
    }

};

在点击它之前它是正确的:

但是当我开始签名时,它会重新绘制 rootPane:

我怎样才能只画线?

【问题讨论】:

  • 尝试调用super.paintComponent(g) 而不是this.paintComponents(g)(注意,在paintComponent 中没有s)。
  • 谢谢,但是现在,当我释放鼠标按钮时,它会在下一个签名中创建一个新行,有些签名不止一行。以及如何删除所有行?
  • 你是说你接受多行签名?
  • 是的,有时签名需要先写一行,然后“举笔”再写第二行
  • 因此,您确定签名结束的事件不应该是鼠标释放,而是类似于给定按钮上的操作(例如,在您的 GUARDAR 按钮上) ) .

标签: java swing jpanel


【解决方案1】:

除了您应该覆盖 paintComponent 而不是 paintComponents 并调用其 super 实现这一事实之外,您还可以通过以下方式为一个签名管理多行。

创建一个行列表(一行就是Point的列表)来表示签名。

当鼠标按下时,在列表中添加一个新行,并将当前点添加到该行。

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

最后,您的绘制方法将一个接一个地绘制每一行,而不会在它们之间建立连接:

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();
        }


    }

}

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

【讨论】:

  • 谢谢!现在我需要一种方法来删除所有行。当一个人在上面签名时,我将清空所有内容并允许用户再次签名。
  • 只需添加一个执行lines = new ArrayList&lt;&gt;() 然后repaint(); 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2014-05-20
  • 2011-01-10
  • 2011-11-15
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多