右键单击 JButton
我正在尝试用 Java 编写一个扫雷克隆,以获取乐趣。我有一个 JButton 网格,我将更改其标签来表示危险计数、标志等。
我的问题是,我不知道如何右键单击 JButton 来按下按钮。我已经完成了以下操作:
button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
boolean mine = field.isMine(x, y);
if (e.isPopupTrigger()) {
button.setText("F");
}
else {
if (mine) {
button.setText("X");
}
}
}
});
这似乎根本不起作用; “F”从未显示,仅显示“X”部分。但更重要的是,这对于按下按钮没有任何作用。
编辑:Mac 的弹出触发器发生在 mousePress 上,而不是 mouseClick 上。
编辑:这是我根据接受的答案制定的解决方案:
button.addMouseListener(new MouseAdapter(){
boolean pressed;
@Override
public void mousePressed(MouseEvent e) {
button.getModel().setArmed(true);
button.getModel().setPressed(true);
pressed = true;
}
@Override
public void mouseReleased(MouseEvent e) {
//if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
button.getModel().setArmed(false);
button.getModel().setPressed(false);
if (pressed) {
if (SwingUtilities.isRightMouseButton(e)) {
button.setText("F");
}
else {
button.setText("X");
}
}
pressed = false;
}
@Override
public void mouseExited(MouseEvent e) {
pressed = false;
}
@Override
public void mouseEntered(MouseEvent e) {
pressed = true;
}
});
add(button);
I am trying to write a Minesweeper clone in Java for fun. I have a grid of JButtons whose labels I will change to represent the danger count, flags, etc.
My problem is, I don't know how to get a right click on a JButton to depress the button. I've done the following:
button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
boolean mine = field.isMine(x, y);
if (e.isPopupTrigger()) {
button.setText("F");
}
else {
if (mine) {
button.setText("X");
}
}
}
});
This doesn't seem to be working at all; the "F" is never shown, only the "X" part. But more importantly, this does nothing for depressing the button.
EDIT: Macs have popup trigger happen on mousePress, not mouseClick.
EDIT: Here's the solution I worked out based off of accepted answer:
button.addMouseListener(new MouseAdapter(){
boolean pressed;
@Override
public void mousePressed(MouseEvent e) {
button.getModel().setArmed(true);
button.getModel().setPressed(true);
pressed = true;
}
@Override
public void mouseReleased(MouseEvent e) {
//if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
button.getModel().setArmed(false);
button.getModel().setPressed(false);
if (pressed) {
if (SwingUtilities.isRightMouseButton(e)) {
button.setText("F");
}
else {
button.setText("X");
}
}
pressed = false;
}
@Override
public void mouseExited(MouseEvent e) {
pressed = false;
}
@Override
public void mouseEntered(MouseEvent e) {
pressed = true;
}
});
add(button);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我不会使用 isPopupTrigger 而是直接检查右侧按钮:
I wouldn't use
isPopupTrigger
but directly check for the right button:右键无法按下按钮。将这样的行添加到鼠标侦听器
mousePressed:
mouseReleased:
或做任何想做的事情。
Button can't be pressed by right click. Add such a lines to you mouse listener
mousePressed:
mouseReleased:
or do there whatever want.
只是一个小补充:检查右键的最简单方法是
SwingUtilities.isRightMouseButton
Just a small addition: the simplest way to check for the right button is
SwingUtilities.isRightMouseButton
正如您所提到的,检查“mousePressed”解决了您的问题。以及 的 Javadoc isPopupTrigger 会解释这样做的必要性:
public boolean isPopupTrigger()
...
注意:弹出菜单在不同系统上的触发方式不同。因此,应该在 mousePressed 和 mouseReleased 中检查 isPopupTrigger 以获得正确的跨平台功能。
另请参阅 Java Swing 教程。
As you have mentioned that checking for "mousePressed" solved your issue. And the Javadoc of isPopupTrigger would explain the need for this:
public boolean isPopupTrigger()
...
Note: Popup menus are triggered differently on different systems. Therefore, isPopupTrigger should be checked in both mousePressed and mouseReleased for proper cross-platform functionality.
Also see the section on The Mouse Listener API in the Java Swing tutorial.
MouseEvent 有一些属性
除其他外。当您的事件触发时检查这些。
编辑
MouseEvent has some properties
among others. Check those when your event fires.
EDIT
右键单击时明显按下的按钮不属于按钮的“正常”行为。您可以使用 JToggleButton 来伪造它,或者在按住鼠标右键时简单地更改按钮的背景颜色和边框。
The button being visibly depressed on right click isn't part of the "normal" behavior of buttons. You may be able to fake it using
JToggleButton
s, or simply changing the button's background color and maybe border while the right mouse button is being held down.如果您确定事件已正确触发(调试 FTW!)并且 button.setText("F") 正在发生,那么也许您只需要重新绘制。
重新绘制按钮。
http:// /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
If you are certain that the event is properly being triggered (debug FTW!) and that the button.setText("F") is happening, then perhaps you simply need to repaint.
Repaint the button.
http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
这在 Mac 上对我来说效果很好:
您也可以检查 e.getButton() == 2,但我不知道在 Mac 上何时触发此操作。
This works for me fine on Mac:
You might as well check for e.getButton() == 2 but I don't know when this one is triggered on Macs.