我在将鼠标拖到它上方时无法使自定义面板重新绘制自己。在拖动鼠标时Java Swing重绘
基本上,我有以下处理程序的自定义面板连接上绘制自由形式的线条:
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<Point> points = ((Line) shape).GetPointList();
Point p1 = points.get(0);
for(int i=1; i<points.size(); i++) {
Point p = points.get(i);
g.drawLine(p1.x, p1.y, p.x, p.y);
p1 = p;
}
}
}
编辑:把它弄出来。这是因为我正在循环查看线条列表,但是我忘了我没有添加我正在绘制的列表,直到我释放鼠标并调用EndLine()。我不得不在repaint()方法中放置单独的代码来绘制我当前处于绘制中间的形状。代码添加到重绘():
if(_currentShape instanceof Geometry.Line) {
ArrayList<Point> points = ((Line)_currentShape).GetPointList();
Point p1 = points.get(0);
for(int i=1; i<points.size(); i++) {
Point p = points.get(i);
g.drawLine(p1.x, p1.y, p.x, p.y);
p1 = p;
}
}
尝试调用重绘上父母的容器以及/而不是 – MadProgrammer