所以我基本上正在处理一个交易或没有交易的java游戏,现在我正试图让用户点击的图像图标消失。所以我有一个6乘6的“金属公文包”(casesArray)图像图标,但无论用户点击的位置,只有左上角的图像图标消失。我猜这只是我的一个逻辑错误,但我似乎无法弄清楚我做错了什么......
class MouseClickListener implements MouseListener
{
public void mouseClicked (MouseEvent event)
{
if (event.getX() <= 133)row=0;
else if (event.getX() <= 267 && event.getX()>133)row=1;
else if (event.getX() <= 400 && event.getX()>267)row=2;
else if (event.getX() <= 533 && event.getX()>400)row=3;
else if (event.getX() <= 667 && event.getX()>533)row=4;
else if (event.getX() <= 800 && event.getX()>667)row=5;
if (event.getY() <= 100)column=0;
else if (event.getY() <= 200 && event.getY() > 100)column=1;
else if (event.getY() <= 300 && event.getY() > 200)column=2;
else if (event.getY() <= 400 && event.getY() > 300)column=3;
else if (event.getY() <= 500 && event.getY() > 400)column=4;
else if (event.getY() <= 600 && event.getY() > 500)column=5;
casesArray[row][column].setIcon(null);
repaint();
}
.
.
.
.
for(int i=0; i<6; i++)
{
for(int j=0; j<6; j++)
{
casesArray[i][j].addMouseListener(new MouseClickListener());
}
}
答案 0 :(得分:1)
MouseEvent
是引发它们的组件的上下文。也就是说,事件的x / y点会自动转换为事件发生的组件的坐标空间。
因此,如果一个组件在其父级中以100x100存在,当您单击它时,鼠标事件将被转换,因此坐标为0x0,表示所单击组件的顶级角。
不要使用一系列if
语句,而是尝试直接引用组件...
class MouseClickListener implements MouseListener
{
public void mouseClicked (MouseEvent event)
{
Component comp = event.getComponent();
if (comp instanceof JLabel) {
((JLabel)comp).setIcon(null);
}
}
}
更新了其他示例
MouseEvent#getSource
返回对创建事件的对象的引用...
class MouseClickListener implements MouseListener
{
public void mouseClicked (MouseEvent event)
{
Object source = event.getSource();
for (int x = 0; x < casesArray.length; x++) {
for (int y = 0; y < casesArray[x].length; y++) {
if (casesArray[x][y] == source) {
casesArray[x][y].setIcon(null);
break;
}
}
}
}
}
更安全的解决方案是继续使用getComponent
,因为事件的来源可能与事件发生的组件不同...
class MouseClickListener implements MouseListener
{
public void mouseClicked (MouseEvent event)
{
Component source = event.getComponent();
for (int x = 0; x < casesArray.length; x++) {
for (int y = 0; y < casesArray[x].length; y++) {
if (casesArray[x][y] == source) {
casesArray[x][y].setIcon(null);
break;
}
}
}
}
}
这基本上从文件夹中加载一堆图像并以6x6网格显示它们。点击任何图片都会将相应的标签图标设置为null
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ClickTest {
public static void main(String[] args) {
new ClickTest();
}
public ClickTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel[][] casesArray;
public TestPane() {
setLayout(new GridLayout(0, 6));
File[] files = new File("/path/to/lots/of/images").listFiles();
MouseListener listener = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
Object source = event.getSource();
for (int x = 0; x < casesArray.length; x++) {
for (int y = 0; y < casesArray[x].length; y++) {
if (casesArray[x][y] == source) {
casesArray[x][y].setIcon(null);
break;
}
}
}
}
};
casesArray = new JLabel[6][6];
int index = 0;
for (int x = 0; x < 6; x++) {
for (int y = 0; y < 6; y++) {
JLabel label = new JLabel();
try {
label.setIcon(new ImageIcon(ImageIO.read(files[index++])));
} catch (IOException ex) {
ex.printStackTrace();
}
label.addMouseListener(listener);
casesArray[x][y] = label;
add(casesArray[x][y]);
}
}
}
}
}
答案 1 :(得分:1)
但无论用户点击何处,只有左上角的图片图标消失
您正在为每个组件添加MouseListener。因此,鼠标点将相对于每个JLabel。因此,只有第一个标签具有准确的鼠标点。
如果要使用if / else逻辑,则只应将单个MouseListener添加到包含36个标签的父JPanel。然后鼠标点相对于面板,您可以使用数学来确定哪个标签位于面板上的特定位置,假设您知道每个标签的大小。
更好的解决方案是创建单个侦听器,但将侦听器添加到每个标签。然后你只需使用MadProgrammer提到的getSource()方法。您应该教您如何使用可由多个组件使用的write通用侦听器。任何时候你看到if / else逻辑你知道你有一个糟糕的设计。
答案 2 :(得分:0)
您可以使用Netbeans Ide Design模式生成代码事件并以这种方式复制代码
Ex:Jlabel事件鼠标点击:
添加鼠标侦听器
lboKH.addMouseListener(lb_Mouse_Click_Event);
声明活动
private MouseListener lb_Mouse_Click_Event = new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent evt) {
JOptionPane.showMessageDialog(getRootPane(), "a");
}
};
@Override
public void mouseClicked(java.awt.event.MouseEvent evt) {
JOptionPane.showMessageDialog(getRootPane(), "a");
}
};