Java 简单的可点击摆动';网格';鼠标事件不';似乎不准确
我正在尝试(目前)创建一个由25个方格组成的网格,向下12个方格,并使它们在单击时在两种颜色之间切换(默认情况下,所有方格都是蓝色的,单击其中一个会将其变为红色。再次单击会将其变回蓝色) 我已经很长时间没有做任何Swing的东西了,这将是我的Android应用程序的一个非常基本的设计工具。它“有点”起作用,但出于某种原因,鼠标位置似乎有点“关闭” 这是一个屏幕截图: 你能看到的鼠标指针,就是我点击的地方,红色的方块就是改变颜色的那个(x位置也被关闭了,但没有“y”那么多) 为什么会这样?我们将不胜感激 代码(对于将我的JPanel称为“myFrames”造成的混乱,我深表歉意;-)Java 简单的可点击摆动';网格';鼠标事件不';似乎不准确,java,swing,grid,jpanel,mouselistener,Java,Swing,Grid,Jpanel,Mouselistener,我正在尝试(目前)创建一个由25个方格组成的网格,向下12个方格,并使它们在单击时在两种颜色之间切换(默认情况下,所有方格都是蓝色的,单击其中一个会将其变为红色。再次单击会将其变回蓝色) 我已经很长时间没有做任何Swing的东西了,这将是我的Android应用程序的一个非常基本的设计工具。它“有点”起作用,但出于某种原因,鼠标位置似乎有点“关闭” 这是一个屏幕截图: 你能看到的鼠标指针,就是我点击的地方,红色的方块就是改变颜色的那个(x位置也被关闭了,但没有“y”那么多) 为什么会这样?我们将
公共类GUI扩展JFrame实现MouseListener{
JFrame myFrame=新的JFrame();
JLabel myPanels[];
公共图形用户界面(){
超级电网;
设置大小(1000400);
可设置大小(假);
setLayout(新网格布局(12,25));
addMouseListener(这个);
myPanels=新的JLabel[300];
对于(int x=0;x,为JFrame(即窗口)添加了单击侦听器,因此鼠标坐标相对于窗口的左上角,而不是网格的左上角
如果您想知道单击了哪个网格元素,只需将单击侦听器添加到每个网格面板而不是整个JFrame中可能会更容易
for (int x = 0;x<myPanels.length;x++){
myPanels[x]=new JLabel("");
myPanels[x].setOpaque(true);
myPanels[x].setBackground(Color.BLUE);
myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
myPanels[x].addMouseListener(this); // <-- add same listener to each grid
}
我正在尝试(现在)创建一个由25个正方形组成的网格,宽12
向下方格,单击时使其在2种颜色之间切换(全部
默认情况下,正方形为蓝色,单击其中一个会将其变为红色。
再次单击将使其再次变回蓝色)
- 使用
JToggleButton.setBackground(Color.Xxx)
,如果JToggleButton.isSelected()
- 将最后选择的项添加到局部变量(字符串)
- 上一点的所有坐标都基于,然后在容器中的
JComponents
内循环,并测试局部变量中的String
是否包含,如果等于
- 顺便说一句,与
JPanel
相同,但是使用JToggleButton
最简单,无需添加任何Listener
,任何代码行,因为JToggleButton
的两种可能状态的这两种颜色可以直接在UIManager
中定义
谢谢@Samual-这确实是问题所在,可以解释为什么Y的偏移量大于X(因为标题栏)-我已经实现了您的解决方案,效果很好-干杯
for (int x = 0;x<myPanels.length;x++){
myPanels[x]=new JLabel("");
myPanels[x].setOpaque(true);
myPanels[x].setBackground(Color.BLUE);
myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
myPanels[x].addMouseListener(this); // <-- add same listener to each grid
}
@Override
public void mouseClicked(MouseEvent e) {
JLabel clickedPanel = (JLabel) e.getSource();
//Toggle colours
if (clickedPanel.getBackground()==Color.blue)
clickedPanel.setBackground(Color.red);
else
clickedPanel.setBackground(Color.blue);
}