我有一個矩形物件的二維陣列,它們在 JPanel 中構成一個網格。我想創建一個方法,它將 MouseEvent 的 x 和 y 坐標作為引數并回傳該陣列中相應 Rectangle 的索引。假設該陣列中的每個 Rectangle 的面積為 30x30 像素,并且我們在 x = 36,y = 15 處有一個點。在這種情況下,結果應該是 indexX = 1 和 indexY = 0。我需要的只是一個公式計算它。
編輯:我制作了我的問題的簡化版本:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class Grid extends JPanel {
private final Rectangle[][] grid = new Rectangle[10][10];
public Grid() {
this.setSize(300, 300);
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 10; j ) {
grid[i][j] = new Rectangle(i * getWidth() / 10, j * getHeight() / 10, 30, 30);
}
}
this.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 10; j ) {
g.setColor(Color.BLUE);
g.fillRect((int) grid[i][j].getX(), (int) grid[i][j].getY(), (int) grid[i][j].getWidth(), (int) grid[i][j].getHeight());
}
}
}
public static Point mousePositionToRectangleIndex(int xPos, int yPos) {
//Problem:
//int indexX = formulaHere;
//int indexY = formulaHere;
// return new Point(indexX, indexY);
return null;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
Grid grid = new Grid();
MouseMotionListener mml = new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
mousePositionToRectangleIndex(e.getX(), e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
}
};
frame.addMouseMotionListener(mml);
frame.add(grid);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
我只需要 mousePositionToRectangleIndex() 的公式
uj5u.com熱心網友回復:
您可以簡單地檢查滑鼠偵聽器中按下了哪個矩形來找出您的 i 和 j。例如:
- 給網格 JPanel 一個首選大小,而不是大小:
public Grid() {
// this.setSize(300, 300);
setPreferredSize(new Dimension(300, 300));
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 10; j ) {
grid[i][j] = new Rectangle((i * getPreferredSize().width) / 10, (j * getPreferredSize().height) / 10, 30, 30);
}
}
addMouseListener(new MyMouse());
}
- 給它一個 MouseListener 來檢查一個矩形是否包含點擊點:
private class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
for (int i = 0; i < grid.length; i ) {
for (int j = 0; j < grid[i].length; j ) {
if (grid[i][j].contains(e.getPoint())) {
System.out.printf("Point pressed, i, j: [%d, %d]%n", i, j);
}
}
}
}
}
- 不要設定 JFrame 的大小(您忘記了選單欄占用空間,而是將其打包:
frame.add(grid);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.setSize(300, 300);
frame.pack();
frame.setVisible(true);
例如:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class Grid extends JPanel {
private final Rectangle[][] grid = new Rectangle[10][10];
public Grid() {
// this.setSize(300, 300);
setPreferredSize(new Dimension(300, 300));
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 10; j ) {
grid[i][j] = new Rectangle((i * getPreferredSize().width) / 10, (j * getPreferredSize().height) / 10, 30, 30);
}
}
addMouseListener(new MyMouse());
}
private class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
for (int i = 0; i < grid.length; i ) {
for (int j = 0; j < grid[i].length; j ) {
if (grid[i][j].contains(e.getPoint())) {
System.out.printf("Point pressed, i, j: [%d, %d]%n", i, j);
}
}
}
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 10; j ) {
g2.setColor(Color.BLUE);
// g.fillRect((int) grid[i][j].getX(), (int) grid[i][j].getY(), (int) grid[i][j].getWidth(), (int) grid[i][j].getHeight());
g2.fill(grid[i][j]);
}
}
}
public static Point mousePositionToRectangleIndex(int xPos, int yPos) {
//Problem:
//int indexX = formulaHere;
//int indexY = formulaHere;
// return new Point(indexX, indexY);
return null;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
Grid grid = new Grid();
MouseMotionListener mml = new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
mousePositionToRectangleIndex(e.getX(), e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
}
};
// frame.addMouseMotionListener(mml);
frame.add(grid);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.setSize(300, 300);
frame.pack();
frame.setVisible(true);
}
}
但話雖如此,整個事情都可以用 JLabel 網格來完成,也許也更干凈一些。在這里,我增加了單擊單元格的顏色:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
public class Grid2 {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
GridPanel mainPanel = new GridPanel();
JFrame frame = new JFrame("GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
@SuppressWarnings("serial")
class GridPanel extends JPanel {
private static final int SIDES = 10;
private static final int MAX_COLORS = 6;
private static final Dimension LABEL_SIZE = new Dimension(30, 30);
private int[][] model = new int[SIDES][SIDES];
private JLabel[][] labelGrid = new JLabel[SIDES][SIDES];
private List<Color> colors = new ArrayList<>();
public GridPanel() {
for (int i = 0; i < MAX_COLORS; i ) {
float hue = ((float) i) / MAX_COLORS;
Color c = Color.getHSBColor(hue, 1f, 1f);
colors.add(c);
}
setLayout(new GridLayout(SIDES, SIDES));
for (int i = 0; i < labelGrid.length; i ) {
for (int j = 0; j < labelGrid[i].length; j ) {
model[i][j] = 0;
JLabel label = new JLabel();
label.setPreferredSize(LABEL_SIZE);
label.setOpaque(true);
label.setBackground(colors.get(0));
label.addMouseListener(new MyMouse(i, j));
labelGrid[i][j] = label;
add(label);
}
}
}
private class MyMouse extends MouseAdapter {
private int i;
private int j;
public MyMouse(int i, int j) {
this.i = i;
this.j = j;
}
@Override
public void mousePressed(MouseEvent e) {
System.out.printf("Point pressed, i, j: [%d, %d]%n", i, j);
model[i][j] ;
model[i][j] %= MAX_COLORS;
labelGrid[i][j].setBackground(colors.get(model[i][j]));
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462470.html
上一篇:GridLayout的未定義行為
