>

두 개의 마우스 버튼을 누른 상태에서 마우스를 끈 다음 두 버튼을 놓으면 어떤 버튼이 해제되었는지 어떻게 알 수 있습니까? 누르고있는 버튼은 MouseEvent.getModifiersEx ()로 검색 할 수 있지만, 릴리즈 이벤트 트리거 전에 눌린 모든 버튼이 해당 마스크에 저장되기 때문에 어떤 버튼이 릴리즈되었는지 알 수있는 방법이 없습니다 :

public void mouseReleased(MouseEvent e) {
    int b1 = MouseEvent.BUTTON1_DOWN_MASK;
    int b2 = MouseEvent.BUTTON2_DOWN_MASK;
    System.out.println(e.getButton()) // prints "0" when the mousereleased
                                      // event follows a mouseDragged
                                      // event
    if ((mouseEvent.getModifiersEx() & b1) == b1) {
      System.out.println("button 1 released");
    } else if ((mouseEvent.getModifiersEx() & b2) == b2) {
      System.out.println("button 2 released");
    }
    /* 
       Following a mouseDragged event, assuming button 1 and button 2 
       were pressed before either was released, the first if clause 
       evaluates to true regardless of which button was actually released.
       In other words, releasing button 2 in this scenario will print
       "button 1 released"
     */
}

mouseReleased 이벤트 앞에 mousePressed 이벤트가 있으면 쉽지만, mouseDragged 앞에 있으면 getButton ()을 호출 할 수 없습니다 ...

  • 답변 # 1

    와이즈 비즈

    왜 안돼?

    드래그가 멈춘 후 마우스 릴리스 상태를 원한다면, MouseAdapter에서 boolean 플래그를 사용하고 드래그 할 때 true로 설정하십시오. 다음과 같은 것 :

    but when it is preceded by mouseDragged, I can't simply call getButton()...

    귀하의 질문을 완전히 오해하지 않는 한, 조금이라도 명확하게 해 줄 것을 요청합니다.

    import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.*; public class MouseButtons extends JPanel { private static final int PREF_W = 800; private static final int PREF_H = 650; public MouseButtons() { MyMouseAdapter myMouse = new MyMouseAdapter(); addMouseListener(myMouse); addMouseMotionListener(myMouse); } @Override public Dimension getPreferredSize() { if (isPreferredSizeSet()) { return super.getPreferredSize(); } return new Dimension(PREF_W, PREF_H); } private class MyMouseAdapter extends MouseAdapter { private boolean dragging = false; @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { String text = ""; int button = e.getButton(); if (button == MouseEvent.BUTTON1) { text = "Button 1"; } else if (button == MouseEvent.BUTTON2) { text = "Button 2"; } else if (button == MouseEvent.BUTTON3) { text = "Button 3"; } if (dragging) { System.out.println(text + " just finished dragging"); } else { System.out.println(text + " not recently dragging"); } dragging = false; } @Override public void mouseDragged(MouseEvent e) { dragging = true; } } private static void createAndShowGui() { JFrame frame = new JFrame("MouseButtons"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new MouseButtons()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> createAndShowGui()); } }

관련 자료

  • 이전 sonarqube5.1 - sonarqube 65 - sql server 데이터베이스를 구성 할 수 없습니다
  • 다음 python - 받아쓰기 목록을 단일 사전으로 변환