我有一个棋盘,将特定方块的颜色设为蓝色(Color.BLUE
),我希望在用户点击蓝色方块时知道该程序。我知道点击的X和Y坐标,但我该怎么做?其他人创建一个图像,然后使用.getRGB()
,但还有另一种方式吗?
答案 0 :(得分:3)
是的还有另一种更好的方法!
由于您已经有x
和y
坐标点击,您现在可以检查这些坐标在棋盘网格中的位置,并且您可以确切地知道点击了哪个方框。< / p>
由于棋盘方块是由您在特定坐标处渲染的,我猜是这样,您可以执行算法将x
和y
坐标与 square 的坐标进行比较将具有位置。
如果这没有帮助让我知道更多细节,那么我可以帮助你。
答案 1 :(得分:3)
你不应该试图“获得像素的颜色”。处理棋盘的逻辑知道棋盘布局是什么以及它着色的是什么像素,因此它应该保留足够的这些信息,以便它可以分辨出被点击的正方形。执行此操作的OOP方法是:定义一个类Chessboard
,其目的是表示在窗口中绘制的棋盘(或Swing组件,或其他)。应该有一种绘制棋盘的方法;该方法将跟踪用于绘制每个方块的像素范围。 (由于每个方块可能具有相同的高度和宽度,因此您实际上不需要保留像素坐标数组;仅保留棋盘左上角的坐标就足够了,您将添加类似width * columnNumber
或height * rowNumber
获取每个方块的坐标。)有关绘制方块的位置的数据将位于Chessboard
的成员字段中。然后你可以添加一个方法,询问Chessboard
“什么方形包含坐标X和Y处的像素?”。我遗漏了很多细节,但我认为这是解决这个问题的最佳方法。
答案 2 :(得分:3)
我会存储一个Rectangle
数组,并在点击时查找哪一个包含该点。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ChessBoard extends JPanel {
public static final int SIZE = 400;
public static final int COUNT = 8;
public static final int TILE_SIZE = SIZE / COUNT;
public static final Color RED = Color.RED;
public static final Color BLUE = Color.BLUE;
public static Tile[][] tiles;
static {
ChessBoard c = new ChessBoard();
tiles = new Tile[COUNT][COUNT];
for (int i = 0; i < COUNT; i++) {
for (int j = 0; j < COUNT; j++) {
tiles[i][j] = c.new Tile(i * TILE_SIZE, j * TILE_SIZE,
TILE_SIZE, TILE_SIZE);
}
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
ChessBoard c = new ChessBoard();
f.setTitle("Chessboard Tile Click");
f.setContentPane(c);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public ChessBoard() {
setPreferredSize(new Dimension(SIZE, SIZE));
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
for (int i = 0; i < COUNT; i++) {
for (int j = 0; j < COUNT; j++) {
Rectangle tile = tiles[i][j];
if (tile.contains(p)) {
JOptionPane.showMessageDialog(null,
String.format("Clicked Tile: %s", tile));
break;
}
}
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
boolean flip = false;
for (int i = 0; i < COUNT; i++) {
for (int j = 0; j < COUNT; j++) {
Rectangle tile = tiles[i][j];
g.setColor((flip = !flip) ? BLUE : RED);
g.fillRect(tile.x, tile.y, TILE_SIZE, TILE_SIZE);
g.setColor(Color.WHITE);
g.drawString(tile.toString(), tile.x + (TILE_SIZE / 2) - 8,
tile.y + (TILE_SIZE / 2) + 6);
}
flip = !flip;
}
}
private class Tile extends Rectangle {
public Tile(int x, int y, int width, int height) {
super(x, y, width, height);
}
@Override
public String toString() {
return String.format("%c%d", 'A' + x / TILE_SIZE, COUNT - y
/ TILE_SIZE);
}
}
}
答案 3 :(得分:1)
尝试使用像素的颜色是不正确的......我很害怕。不,这样做:
使用鼠标x和y确定单击了哪个方格。
使用您用于确定“特定”方块的相同规则以蓝色:确定所点击方块的性质并采取相应的操作。