マウスをドラッグしているときに、カスタム パネルを再描画するのに苦労しています。
基本的に、次のハンドラーがアタッチされたカスタム パネルに自由形式の線を描画しています。
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() メソッドに別のコードを配置する必要がありました。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;
}
}