当我将鼠标拖过它时,我很难让自定义面板重新绘制自己.
基本上,我在自定义面板上绘制自由形式的线条,并附带以下处理程序:
MouseInputAdapter mia = new MouseInputAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if(_app_split_right_buttons_radioInkBtn.isSelected()) {
_app_split_right_journal.StartLine();
_app_split_right_journal.AddLineSegment(e.getX(), e.getY());
}
_app_split_right_journal.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
if(_app_split_right_buttons_radioInkBtn.isSelected()) {
_app_split_right_journal.AddLineSegment(e.getX(), e.getY());
_app_split_right_journal.EndLine();
}
_app_split_right_journal.repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
if(_app_split_right_buttons_radioInkBtn.isSelected()) {
_app_split_right_journal.AddLineSegment(e.getX(), e.getY());
}
_app_split_right_journal.repaint();
}
};
_app_split_right_journal.addMouseListener(mia);
_app_split_right_journal.addMouseMotionListener(mia);
但是,在我拖动鼠标时,我似乎无法重新绘制它,只有在我释放它之后(线条正确绘制).奇怪的是,如果在我拖动的中间,我右键单击,当我拖动时,该线将突然开始绘制.
任何帮助,将不胜感激.
编辑:为清楚起见,StartLine()/ AddLineSegment()/ EndLine()函数只是将点添加到Point对象的ArrayList,并且重写了repaint()函数以循环这些点并在每个点之间绘制线段.代码如下:
public void DrawShapes(Graphics g) {
g.setColor(Color.black);
for(Geometry.Shape shape : _shapeList) {
if(shape instanceof Geometry.Line) {
ArrayList points = ((Line) shape).GetPointList();
Point p1 = points.get(0);
for(int i=1; i
Point p = points.get(i);
g.drawLine(p1.x, p1.y, p.x, p.y);
p1 = p;
}
}
}
编辑:想出来.这是因为我在循环列表中循环,但是我忘记了在我释放鼠标并调用EndLine()之前,我没有添加我正在绘制到该列表的行.我必须在repaint()方法中放置单独的代码来绘制我当前在绘图中间的形状.代码添加到repaint():
if(_currentShape instanceof Geometry.Line) {
ArrayList points = ((Line)_currentShape).GetPointList();
Point p1 = points.get(0);
for(int i=1; i
Point p = points.get(i);
g.drawLine(p1.x, p1.y, p.x, p.y);
p1 = p;
}
}