我正在尝试用Java编写一个Minesweeper克隆以获得乐趣。我有一个JButtons网格,我将更改其标签以表示危险计数,标志等。
我的问题是,我不知道如何右键单击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”部分。但更重要的是,这对于按下按钮没有任何作用。
编辑:Macs的弹出触发器发生在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);
答案 0 :(得分:5)
我不会使用isPopupTrigger
,而是直接检查右键:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
答案 1 :(得分:5)
右键单击无法按下按钮。将这样的行添加到鼠标侦听器
的mousePressed:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
的mouseReleased:
if(needReset) {underlyingButton.getModel().setPressed(false));
或者做任何想做的事。
答案 2 :(得分:2)
只需添加一小部分:检查右键的最简单方法是SwingUtilities.isRightMouseButton
答案 3 :(得分:1)
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseEvent.html
MouseEvent有一些属性
static int BUTTON1
static int BUTTON2
static int BUTTON3
等。当你的事件发生时,检查那些。
修改
public int getButton()
Returns which, if any, of the mouse buttons has changed state.
答案 4 :(得分:1)
正如您所说,检查“mousePressed”解决了您的问题。而isPopupTrigger的Javadoc将解释对此的需求:
public boolean isPopupTrigger()
...
注意:弹出菜单在不同系统上的触发方式不同。因此,应该在mousePressed和mouseReleased中检查isPopupTrigger以获得正确的跨平台功能。 的
另请参阅Java Swing教程中鼠标侦听器API 部分。
答案 5 :(得分:0)
右键单击时按下按钮不是按钮“正常”行为的一部分。您可以使用JToggleButton
伪造它,或者只是在按住鼠标右键的同时更改按钮的背景颜色和边框。
答案 6 :(得分:0)
如果您确定事件被正确触发(调试FTW!)并且发生了button.setText(“F”),那么您可能只需要重新绘制。
重新绘制按钮。 http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
答案 7 :(得分:0)
这在Mac上对我很有用:
import java.awt.event.*;
import javax.swing.*;
public class ButtonTest extends JFrame {
JButton button;
public ButtonTest() {
button = new JButton("W");
button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == 3) { // if right click
button.setText("F");
button.getModel().setPressed(false);
// button.setEnabled(true);
} else {
button.setText("X");
button.getModel().setPressed(true);
// button.setEnabled(false);
}
}
});
this.add(button);
this.setVisible(true);
}
public static void main(String[] args) {
new ButtonTest();
}
}
您也可以检查e.getButton()== 2但我不知道在Mac上何时触发此操作。