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) スクロールペイン – ザワプロ!