2011-12-01 5 views
1

AspectJ로 클릭 한 버튼을 캡쳐하고 파라미터 (예 : 버튼 이름)를 얻는 방법을 알고 싶다. AspectJ로 캡쳐하는 것이 더 일반화되었다고 생각합니다. 일반적으로 다른 UI 요소를 캡처 할 수 있도록 MouseListener가 사용됩니다.AspectJ 캡쳐 버튼 클릭

예 : 일부 작업

public JButton btn1 = new JButton("Test1"); 
public JButton btn2 = new JButton("Test2"); 

btn1.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
         //take some actions 
        } 
       } 

btn2.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
         //take some actions 
        } 
      } 

어떻게 AspectJ를 가진이 버튼을 캡처하고 해당 매개 변수 (. 예를 들어, 이름)을 얻는을 2 개 버튼을 정의 I는 GUI 예에서

?

답변

1

가능합니다. 나는 두 가지 예를 제시했다. 첫 번째는 JButton에 대해 ActionListener을 인쇄합니다. 다른 예제는 특정 버튼을 클릭 한 경우에만 인쇄합니다.

인쇄는 모든 JButton의 텍스트는 ActionListener로 클릭 :

@Pointcut("execution(* *.actionPerformed(*)) && args(actionEvent)") 
public void buttonPointcut(ActionEvent actionEvent) {} 

@Before("buttonPointcut(actionEvent)") 
public void beforeButtonPointcut(ActionEvent actionEvent) { 
    if (actionEvent.getSource() instanceof JButton) { 
     JButton clickedButton = (JButton) actionEvent.getSource(); 
     System.out.println("Button name: " + clickedButton.getText()); 
    } 
} 

인쇄 특정 JButton의 텍스트 : 갱신

public static JButton j1; 

@Pointcut("execution(* *.actionPerformed(*)) && args(actionEvent) && if()") 
public static boolean button1Pointcut(ActionEvent actionEvent) { 
    return (actionEvent.getSource() == j1); 
} 

@Before("button1Pointcut(actionEvent)") 
public void beforeButton1Pointcut(ActionEvent actionEvent) { 
    // logic before the actionPerformed() method is executed for the j1 button.. 
} 

을 :

당신은이 작업을 수행 할 수 있습니다

다양한 방법. 예를 들어 버튼을 애스펙트에 직접 추가하십시오. 하지만 (ButtonManager는이 경우) 사이에 enum 객체를 사용하는 것을 선호하므로 코드가 aspect에 대해 알지 못합니다. 그리고 ButtonManager는 enum 객체이기 때문에 애스 팩트에서 값을 쉽게 검색 할 수 있습니다.

오라클의 스윙 버튼 클래스로 테스트 한 결과 작동합니다. 스윙 클래스에서 :이 조작 클래스에 관해서

b1 = new JButton("Disable middle button", leftButtonIcon); 
ButtonManager.addJButton(b1); 

AspectJ를 매우 강력하지만 직조 할 수없는 개체가 직물의 시점에서 생성되지 않기 때문에 특정 개체에 조언한다. 그래서 당신은 오직 런타임에 객체를 가지고 작업 할 수 있습니다. 그래서 위의 addJButton (..) 메소드를 추가했습니다. 이를 통해 애스펙트 된 단추를 등록 된 단추 목록과 비교하여 검사 할 수 있습니다.

ButtonManager 클래스 :

public enum ButtonManager { 

    ; 

    private static Collection<JButton> buttonList = new LinkedList<JButton>(); 

    public static void addJButton(JButton jButton) { 
     buttonList.add(jButton); 
    } 

    public static Collection<JButton> getButtonList() { 
     return buttonList; 
    } 
} 

수정 포인트 컷과 조언 단지로는 ButtonManager에 등록 된 버튼의 이름을 인쇄 : 2

좋아 업데이트]

@Pointcut("execution(* *.actionPerformed(*)) && args(actionEvent) && if()") 
public static boolean buttonListPointcut(ActionEvent actionEvent) { 
    Collection<JButton> buttonList = ButtonManager.getButtonList(); 
    JButton registeredButton = null; 
    for (JButton jButton : buttonList) { 
     if (actionEvent.getSource() == jButton) { 
      registeredButton = jButton; 
     }   
    } 
    return registeredButton != null; 
} 

@Before("buttonListPointcut(actionEvent)") 
public void beforeButtonListPointcut(ActionEvent actionEvent) { 
    JButton clickedButton = (JButton) actionEvent.getSource(); 
    System.out.println("Registered button name: " + clickedButton.getText()); 
} 

를 I 네가 원하는 걸 이해한다고 믿어. 마우스 이벤트를 듣고 싶습니다. 그것은 가능합니다. 단점은 마우스 수신기로 클릭을 듣고 싶은 모든 GUI 구성 요소를 등록해야한다는 것입니다. JFrame의 JPanel을 MouseListener에 등록하는 것으로는 충분하지 않습니다. 따라서 버튼에 대한 ActionListener 만 등록한 경우에는 마우스 수신기도 추가해야합니다.

나는 저를 위해 작동하는 빠른 해결책을 창조했다. 그것은 단지 그것이 효과가 있다는 것을 보여줍니다. 나는 많은 다른 GUI 객체로 솔루션을 일반화하려고 시도하지 않았다.하지만 당신이 일할 기초를 가지고있을 때 리팩토링하는 것이 아주 쉬울 것입니다. 가로 세로 클래스

MouseListener myListener = new MouseListener(); 

btn1.addMouseListener(myListener); 
btn2.addMouseListener(myListener); 

: 이것은 다음과 같은 결과를 초래

@Pointcut("execution(* *.mouseClicked(*)) && args(mouseEvent)") 
public void mouseEventPointcut(MouseEvent mouseEvent) {} 

@Before("mouseEventPointcut(mouseEvent)") 
public void beforeMouseEventPointcut(MouseEvent mouseEvent) { 
    if (mouseEvent.getSource() instanceof JButton) { 
     JButton clickedButton = (JButton) mouseEvent.getSource(); 
     System.out.println("aspectJ --> mouseClicked: " + clickedButton.getText()); 
    } 
} 

스윙 클래스의 초기화 방법에

private class MouseListener extends MouseInputAdapter { 
     public void mouseClicked(MouseEvent e) {} 
} 

: 스윙 클래스

콘솔의 경우 :

AspectJ를 ->의 mouseClicked : Test1을

나는 그것이 도움이되기를 바랍니다!

+0

예제와 함께 내 질문을 편집하여 캡처해야합니다. 일반 버튼으로 캡처하는 첫 번째 아이디어는 필요한 것입니다. 또한 일반적으로 UI 요소를 클릭하면 캡쳐해야합니다. 따라서 MouseListener를 결합해야한다고 생각합니까? – 100798

+0

업데이트 된 섹션이 귀하의 케이스를 해결합니까? 귀하의 케이스가 정확하다는 것을 이해하면 MouseListener가 필요하지 않습니다. – Espen

+0

MouseListener에 대해 언급 할 때 좀 더 일반적인 경우를 지적했습니다. UI 요소를 일반적으로 캡처합니다 (텍스트 필드, 버튼, 콤보 상자 등 포함). AspectJ와 MouseListener를 함께 사용할 수 있다고 생각하십니까? – 100798