2012-01-26 19 views
2

私は、Javaスイングチェスアプリケーションを持っています。カーソルには、セル全体に合わせた大きさのカスタムビュー - 長方形があります。そして、私はカーソルが全体の細胞だけを移動する必要があります。 1つのセルの限界ではありません。この問題の典型的な解決策がいくつかありますか?または、標準的なJavaの機能をステップタイプのカーソル移動で設定することは可能でしょうか?スイングステップ型カーソル移動

enter image description here

答えて

6

私は、カーソルを "ステッピング" のいくつかの種類を実装していないでしょう。代わりに、私はカーソルを完全に隠し、現在のセルをプログラムで強調表示します。

  • this question and answerのカーソルを非表示にします。
  • マウスの動きを取得(およびpaintComponentカスタムコンポーネントの方法

全例その「出力」以下、このスクリーンショットでは、それを強調するためにMouseMotionListenerを使用します。

screenshot

public class StepComponent extends JComponent implements MouseMotionListener { 
    private Point point = new Point(0, 0); 

    public StepComponent() { 
     setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
       new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), 
       new Point(0, 0), "blank cursor")); 
     addMouseMotionListener(this); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int x = 0, y = 0; 
     while (x < getWidth()) { g.drawLine(x, 0, x, getHeight()); x += 10; } 
     while (y < getHeight()) { g.drawLine(0, y, getWidth(), y); y += 10; } 
     if (point != null) 
      g.fillRect(point.x, point.y, 10, 10); 
    } 
    @Override public void mouseDragged(MouseEvent e) { update(e.getPoint()); } 
    @Override public void mouseMoved(MouseEvent e) { update(e.getPoint()); } 

    private void update(Point p) { 
     Point point = new Point(10 * (p.x/10), 10 * (p.y/10)); 
     if (!this.point.equals(point)) { 
      Rectangle changed = new Rectangle(this.point,new Dimension(10,10)); 
      this.point = point; 
      changed.add(new Rectangle(this.point, new Dimension(10, 10))); 
      repaint(changed); 
     } 
    } 
} 

いくつかのテストコード:

public static void main(String[] args) { 

    JFrame frame = new JFrame("Test"); 

    frame.add(new StepComponent()); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 300); 
    frame.setVisible(true); 
} 
+0

このコメントredactorは私を殺すでしょう... Enterはちょうど「完璧」で動作します – fland

+0

完全な例で私の更新された答えをチェックしてください! – dacwe

+0

ありがとうございます。私はこのような種類のソリューションの前にGlass Panelを使ってみました。空のパネルをほとんど再ペイントするのが速く、チェスデスクでパネルを再ペイントすると思っていました。主な問題はパフォーマンスです。 Repaintメソッドには多くのリソースが必要です。マウスを動かすと、特にアプリケーションが最大化すると、すべてのプロセッサ時間がかかります。 そのため、私はカスタムマウスカーソルを試してみることにしました。 – fland

関連する問題