我正在尝试使用基本GUI作为夏季项目,并希望能够在使用Java Swing的MouseAdapter单击并按住瓷砖时遮蔽周围的瓷砖
@Override
public void mousePressed(MouseEvent e){ // shades surrounding tiles
for (int rowOff = tileLoc.row() - 1; rowOff < tileLoc.row() + 2; rowOff++) {
for (int colOff = (tileLoc.col() - 1); colOff < tileLoc.col() + 2; colOff++) {
// TODO add validTile()
allTiles[rowOff][colOff].setBackground(Color.GRAY);
}
}
}
@override
public void mouseReleased(MouseEvent e){
// undoes shading & clicks tile
}
(TileLoc是一个记录2值,行和col)
这段代码的工作方式我想要的,但问题是,它也得到调用mouseclick ()
@Override
public void mouseClicked(MouseEvent e){ // 1 is left click, 3 is right click
switch (e.getButton()){
case 1:
//does board.leftClick()
case 3:
//does board.rightClick()
break;
default:
break;
}
}
我怎样才能使mouseclick()不遮蔽和不遮蔽瓷砖?
最好的方法是使用计时器变量。当鼠标被按下时,将当前时间保存到一个类变量pressedTime = System.currentTimeMillis();
:
long pressedTime = -1;
public void mousePressed(MouseEvent e){ // shades surrounding tiles
pressedTime = System.currentTimeMillis();
//Your code here...
//...
}
现在我们可以改变mouserelesed和mouseclick方法的行为来考虑这个计时器,并采取相应的行动:
@override
public void mouseReleased(MouseEvent e){
//Find the time difference
long timeDifference = System.currentTimeMillis() - pressedTime;
//If the held time is long enough do the held action
if(timeDifferenec > yourRequiredTime){
//Do something
}
//Else if the click was shorter than your hold time then manage your click like normal:
else{
switch (e.getButton()){
case 1:
//does board.leftClick()
case 3:
//does board.rightClick()
break;
default:
break;
}
}
//Do nothing in the mouseClicked event, we can manage this entirely in the mouse released event
public void mouseClicked(MouseEvent e){
//Nothing here
}
请注意,根据您使用它的情况,如果您与多个函数/按钮共享变量,那么您可能需要在单击后将pressedTime
的值重置为-1,并在采取任何操作之前检查-1值。
鼠标点击包括在同一位置按下和释放按钮。你想在鼠标被点击时做出反应——此时你不知道用户什么时候释放按钮。
所以下定决心:你想马上做出反应吗?我觉得你已经有了。你想反应迟缓吗?(这是sorfiend的建议。)如果用户在同一位置长时间后释放按钮,会发生什么情况:这是一次缓慢的点击,还是有其他含义?所有的解决方案都满足用户按下鼠标按钮时相邻字段突出显示的要求。