2010-01-12 4 views
1
내가 하나가 버튼을 누를 때 어떤 행동을 할 것입니다 이벤트를 구현하고 버튼을 나는이 방법에 대한 MouseListerner을 추가하려고

자바 스윙 이벤트

을 발표 할 때 해당 작업을 중지하는 방법을 궁금해

. 문제는 내가 버튼을 눌렀 음을 인식 할 것입니다. 그러나 그것은 어떤 버튼이 아닙니다. 어떤 버튼을 눌렀는지 알 수 있도록 어떻게 써야하는지 궁금합니다.

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 


public class Main extends JFrame implements MouseListener, ActionListener{ 

    private JPanel panel1 = new JPanel(); 
    private JPanel panel2 = new JPanel(new GridLayout(4,4)); 



    public Main() { 
     setSize(300,400); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     setLayout(new BorderLayout()); 
     add(panel1, BorderLayout.NORTH); 
     add(panel2, BorderLayout.CENTER); 

     String[] buttonNamn = {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 

     for(int i=0;i<buttonNamn.length;i++) { 
      JButton button = new JButton(buttonNamn[i]); 
      panel2.add(button); 
      button.addMouseListener(this); 
      button.addActionListener(this); 
     } 

    } 
    public static void createGUI() { 
     new Main(); 
    } 

    public static void main(String[] args) { 

     createGUI(); 
    } 
    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mousePressed(MouseEvent arg0) { 
     System.out.println("Pressed"); 

    } 
    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     System.out.println("Relased"); 


    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getActionCommand().equals("1")) { 
      System.out.println("Foo 1"); 
     } 
     else if(e.getActionCommand().equals("2")){ 
      System.out.println("Foo 2"); 
     } 
    } 
} 

답변

0

된 MouseEvent의 getSource와 방법은 이벤트를 트리거 버튼을 얻기 위해 당신에게 클릭 버튼 java api link

+0

아아, 그래서 getSource가 있습니다. 흠 그러나 행동은 한 번 호출됩니다. 마우스 버튼을 놓을 때까지 액션을 반복 할 수 있습니까? – starcorn

0

사용 MouseEvent.getButton()에 대한 참조를 제공해야합니다은 EventObject로부터 상속. 여기에 설명 된대로

+0

getButton은 클릭 된 마우스 버튼을 반환합니다. – Guy

+0

API에 따라 : 마우스 단추 중 상태가 변경된 경우 반환합니다. http://java.sun.com/javase/6/docs/api/java/awt/event/MouseEvent.html#getButton%28%29 –

+0

@Guy : OP가 얻고 자하는 귀하의 가정에 동의합니다. 마우스 버튼 대신에 눌려진'JButton', 그러나 절대적으로 명확한 것은 아니므로 여러분의 의견을 덧붙이고 **하지 말고 ** 하향 투표하는 것이 내 의견으로는 충분했을 것입니다. –

1

을 차단합니다.

취소의 경우 일반적으로 invokeLater에 제공된 Runnable이 구현하는 취소 작업이있는 인터페이스를 사용합니다. 취소 버튼은 취소 작업을 호출하여 취소를 시작합니다. 이것이 작동을 취소하는 방법은 그것이 무엇을하는지에 달려 있습니다. 실행중인 작업이 주기적으로 점검해야 계속 취소되는지 여부를 확인할 수있는 취소 된 플래그를 설정할 수 있습니다.

1

MouseAdapter과 같은 청취자 구현 클래스를 확장하여 타이핑을 줄일 수 있습니다 (사용하려는 메서드 만 재정의).

하나의 리스너를 사용하고 단추와 데이터 간의 관계를 파악하기 위해 일련의 case 문을 사용하는 대신 각 단추에 새 수신기를 추가하고 수신기에서 데이터를 보유하십시오. 이 코드는 anonymous class으로이 작업을 수행합니다.

public static void main(String[] args) { 
    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(4, 4)); 
    String[] buttonName = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", 
     "B", "C", "D", "E", "F" }; 
    for (final String name : buttonName) { 
     JButton button = new JButton(name); 
     panel.add(button); 
     button.addMouseListener(new MouseAdapter() { 
     @Override public void mousePressed(MouseEvent e) { 
      System.out.println("pressed:" + name); 
     } 

     @Override public void mouseReleased(MouseEvent e) { 
      System.out.println("released:" + name); 
     } 
     }); 
    } 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(panel); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

키워드는 final입니다.

원하는 경우 다른 방법으로 표현할 수 있습니다. 이 방법은 정적 내부 클래스를 추가합니다 : 당신이 수행 할 코드/작업을해야합니다

public void addNameListener(JButton button, final String name) { 
    class MyListener extends MouseAdapter { 
     @Override public void mousePressed(MouseEvent e) { 
     System.out.println("pressed:" + name); 
     } 

     @Override public void mouseReleased(MouseEvent e) { 
     System.out.println("released:" + name); 
     } 
    } 
    button.addMouseListener(new MyListener()); 
    } 

다른 스레드에서 수행 할 :

private static class MyListener extends MouseAdapter { 
    private final String name; 

    public MyListener(String name) { 
     this.name = name; 
    } 

    @Override public void mousePressed(MouseEvent e) { 
     System.out.println("pressed:" + name); 
    } 

    @Override public void mouseReleased(MouseEvent e) { 
     System.out.println("released:" + name); 
    } 
    } 

    public void addStaticInnerClassListener(JButton button, String name) { 
    button.addMouseListener(new MyListener(name)); 
    } 

이 하나의 방법으로 범위 클래스를 사용합니다. 스윙은 이에 대한 몇 가지 유틸리티 클래스를 제공합니다 (예 : SwingWorker).