2
私は、Javaスイングチェスアプリケーションを持っています。カーソルには、セル全体に合わせた大きさのカスタムビュー - 長方形があります。そして、私はカーソルが全体の細胞だけを移動する必要があります。 1つのセルの限界ではありません。この問題の典型的な解決策がいくつかありますか?または、標準的なJavaの機能をステップタイプのカーソル移動で設定することは可能でしょうか?スイングステップ型カーソル移動
私は、Javaスイングチェスアプリケーションを持っています。カーソルには、セル全体に合わせた大きさのカスタムビュー - 長方形があります。そして、私はカーソルが全体の細胞だけを移動する必要があります。 1つのセルの限界ではありません。この問題の典型的な解決策がいくつかありますか?または、標準的なJavaの機能をステップタイプのカーソル移動で設定することは可能でしょうか?スイングステップ型カーソル移動
私は、カーソルを "ステッピング" のいくつかの種類を実装していないでしょう。代わりに、私はカーソルを完全に隠し、現在のセルをプログラムで強調表示します。
paintComponent
カスタムコンポーネントの方法全例その「出力」以下、このスクリーンショットでは、それを強調するためにMouseMotionListenerを使用します。
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);
}
このコメントredactorは私を殺すでしょう... Enterはちょうど「完璧」で動作します – fland
完全な例で私の更新された答えをチェックしてください! – dacwe
ありがとうございます。私はこのような種類のソリューションの前にGlass Panelを使ってみました。空のパネルをほとんど再ペイントするのが速く、チェスデスクでパネルを再ペイントすると思っていました。主な問題はパフォーマンスです。 Repaintメソッドには多くのリソースが必要です。マウスを動かすと、特にアプリケーションが最大化すると、すべてのプロセッサ時間がかかります。 そのため、私はカスタムマウスカーソルを試してみることにしました。 – fland