gpt4 book ai didi

java - 使用 mouseClicked 在 JPanel 中着色 - 错误

转载 作者:行者123 更新时间:2023-12-01 18:11:48 25 4
gpt4 key购买 nike

美好的一天,

我的问题标题可能有点含糊,但我希望这能解释。该场景非常基本 - 我有一个 JFrame,其中有一个 JPlanes 数组。这个想法是,当我点击其中一个时,点击后应该变成黑色。这是代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
import javax.swing.border.Border;

public class PixelArt {

JFrame frame;
Border blackline;
JPanel squares[][] = new JPanel[100][100];
int x;
int y;

public PixelArt() {

frame = new JFrame("Pixel Art");
frame.setSize(1000, 1000);
frame.setLayout(new GridLayout(100, 100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
x = i;
y = j;
squares[i][j] = new JPanel();
squares[i][j].setBorder(BorderFactory.createDashedBorder(null));
squares[i][j].addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

x = e.getX();
y = e.getY();
squares[x][y].setBackground(Color.black);

}
});

frame.add(squares[i][j]);
}
}

frame.setVisible(true);
}

public static void main(String[] args) {
new PixelArt();
}
}

实际的问题是这段代码没有执行我上面解释的操作。单击时,它确实会以 JPlane 之一的黑色着色,但在从网格上角开始的 9x9 区域内。对此我没有任何解释。问题似乎出在以下两行:

    x = e.getX();
y = e.getY();

我的猜测之一是我在坐标系中存在某种偏移,但这并不能解释为什么无论我按下哪个 JPanel,彩色的 JPanel 都仅位于上部 9x9 区域。

有人知道如何解决我上面描述的问题吗?如果我的解释有不清楚的地方,请询问。先感谢您。

这是工作代码的屏幕截图:

Screenshot of working code

最佳答案

您可以使用 event.getSource() 检测单击的面板,如下面的示例代码

public void mouseClicked(MouseEvent e) {

JPanel panel = (JPanel)e.getSource();//
panel.setBackground(Color.black);

}

问题是你不能直接使用x,y作为数组元素的索引。因为面板也有宽度和边框。如果你选择 x y,你就必须做一些数学逻辑。例如,您单击网格中第一个 jpanel 的中间,所以我们假设 x 和 y 坐标约为 10px,但在您的代码中您调用 [10][10] Janel 但实际上您应该调用 [0][0]。同样,正如 @Cr0w3 所说,您将监听器添加到所有面板。因此,如果您单击第一个网格单元或最后一个网格单元的中间,则 x,y 没有区别。

但是,如果您使用数学逻辑来检测单击的元素,则需要考虑框架/主面板宽度(也必须在调整大小时更新)和边框厚度。

您真的想使用10000 个面板来执行此操作吗?您可能需要使用一个面板并覆盖绘制组件方法。10000 个面板对于这种情况无效。如果您调整大小或者快速单击面板,您会发现这需要很多时间。所以你可能需要在 jpanel 上绘制图形。请参阅此 example

关于java - 使用 mouseClicked 在 JPanel 中着色 - 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com