C#やAndroidでも同じようなことをするアプリはすぐ作れるのだが、Swingではどうやるのかが気になったのでメモしておく。
Swingでマウスの軌跡を描画するサンプル
MyCanvas.java
public class MyCanvas extends JComponent {
private static final long serialVersionUID = 1L;
private final List<Point> points = new ArrayList<Point>();
public MyCanvas(){
super();
// MouseMotionListenerを使えばドラッグ処理を簡単に書ける
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
points.add(new Point(e.getX(),e.getY()));
// 画面を再描画する
repaint();
}
});
}
// paintComponentは標準でダブルバッファが有効である
// 画面を消去する必要は無い。
@Override
protected void paintComponent(Graphics g) {
for(Point p : points){
g.drawRect(p.x, p.y, 1, 1);
}
};
}
Main.java
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
frame.setBounds(100, 100, 400, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new MyCanvas());
frame.setVisible(true);
}
});
}
}
Swingならではのポイントとしては、MouseMotionListenerを使えばドラッグ処理を簡単に書けることが分かった。
また、JComponentのpaintComponent()は標準でダブルバッファが有効であるようで、repaint()メソッドで再描画してもちらつきが無い。
画面のクリアも自動的にやってくれるようだ。
実行すると下のようになる。

ピンバック: 【Java】Swing復習 その(3) スクロールペイン – ザワプロ!