Java Jpanel错误重新绘制
我已经创建了自己的扩展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() {
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();
。