私はまだ Java の基礎を学んでいるので、この質問が基礎的なものでしたら申し訳ありません。私がやろうとしたことは、ポイントとラインを格納してからArrayLists
、paintComponent()
メソッドにそれらを通過させ、呼び出されるたびに描画させることです。ポイントに同じArrayList
ものを使用しているので、マウスを押すたびにクリアして、新しいラインが前のラインと接続しないようにします。
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
public class SwingPaintDemo2 {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
f.add(new MyPanel());
f.setBackground(Color.WHITE);
f.setVisible(true);
}
}
class MyPanel extends JPanel {
private int x;
private int y;
private int x2;
private int y2;
private ArrayList<Point> points = new ArrayList<Point>();
private ArrayList<Curves> curvedLines = new ArrayList<Curves>();
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
points.clear();
points.add(new Point(e.getX(), e.getY()));
}
@Override
public void mouseReleased(MouseEvent e) {
ArrayList<Point> newPoints = new ArrayList<Point>();
for (int i = 0; i < points.size(); i++) {
newPoints.add(points.get(i));
}
curvedLines.add(new Curves(newPoints));
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
for (int c = 0; c < points.size() - 1; c++) {
x = (int) points.get(c).getX();
y = (int) points.get(c).getY();
x2 = (int) points.get(c + 1).getX();
y2 = (int) points.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
for (int t = 0; t < curvedLines.size(); t++) {
ArrayList<Point> iterator = curvedLines.get(t).points;
for (int c = 0; c < iterator.size() - 1; c++) {
x = (int) iterator.get(c).getX();
y = (int) iterator.get(c).getY();
x2 = (int) iterator.get(c + 1).getX();
y2 = (int) iterator.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
}
}
class Curves {
private ArrayList<Point> points;
public Curves(ArrayList<Point> points) {
this.points = new ArrayList<Point>();
this.points = points;
}
}
}
問題は、マウスをドラッグしている間、線が描画されないことですが、マウスを再度ドラッグすると線が表示されるため、そのポイントはまだ保存されています。この明らかな遅延の原因は何ですか?