문제

나는 재미를 위해 Java로 광산물 클론을 쓰려고 노력하고 있습니다. 나는 위험 수, 깃발 등을 나타 내기 위해 라벨을 변경하는 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"부분 만 표시되지 않습니다. 그러나 더 중요한 것은 버튼을 누르는 데 아무런 영향을 미치지 않습니다.

편집 : Mac은 Mouseclick이 아닌 Mousepress에서 팝업 트리거가 발생합니다.

편집 : 여기에 허용 된 답변을 기반으로 한 해결책은 다음과 같습니다.

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);

광산 클론 http://grab.by/1y9z

도움이 되었습니까?

해결책

마우스 오른쪽 버튼으로 버튼을 누를 수 없습니다. 마우스 리스너에 그러한 라인을 추가하십시오

무성한 :

if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));

MouserELEARD :

if(needReset) {underlyingButton.getModel().setPressed(false));

또는 원하는대로 거기에서하십시오.

다른 팁

나는 사용하지 않을 것이다 isPopupTrigger 그러나 오른쪽 버튼을 직접 확인하십시오.

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...

작은 추가 : 오른쪽 버튼을 확인하는 가장 간단한 방법은 SwingUtilities.isRightMouseButton

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

무엇보다도. 이벤트가 시작될 때 확인하십시오.

편집하다

공개 int getButton ()

Returns which, if any, of the mouse buttons has changed state. 

당신이 언급 한 바와 같이, "Mousepressed"를 확인하면 문제가 해결되었습니다. 그리고 Javadoc iSpopuptrigger 이것에 대한 필요성을 설명 할 것입니다.

공개 부울 ispopuptrigger ()
...
참고 : 팝업 메뉴는 다른 시스템에서 다르게 트리거됩니다. 따라서 적절한 크로스 플랫폼 기능을 위해 Mousepressed 및 MouserEleided에서 iSpopuptrigger를 점검해야합니다.

또한 섹션을 참조하십시오 마우스 리스너 API 자바에서 그네 지도 시간.

오른쪽 클릭에 눈에 띄게 우울한 버튼은 버튼의 "정상적인"동작의 일부가 아닙니다. 당신은 그것을 사용하여 그것을 가짜로 만들 수 있습니다 JToggleButton오른쪽 마우스 버튼이 고정되는 동안 버튼의 배경색과 경계를 변경하거나 간단히 변경합니다.

이벤트가 올바르게 트리거되고 (디버그 FTW!) 버튼이 발생한다고 확신한다면 .Settext ( "F")가 발생하고 있다면 단순히 다시 칠해야 할 것입니다.

버튼을 다시 칠하십시오.http://java.sun.com/javase/6/docs/api/javax/swing/jcomponent.html#repaint (java.awt.rectangle)

이것은 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에서 언제 트리거되는지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top