2013-04-05 4 views
2

JRadioButtonJPanel을 추가하여 라디오 버튼에 원하는 것을 표시 할 수 있습니다.부모가 마우스 이벤트를 처리하도록 허용

이 모두가 예상대로 작동했습니다. 그러나 텍스트 배치를 허용하기 위해 나는 JTextArea을 사용하여 라디오 버튼에 포함 된 JPanel에 추가했습니다.

는 지금은 사용자가 JTextArea를 클릭하면, 다음 JTextAreamouseEvent을 소비하고 그 결과로 라디오 버튼에서 응답이 (가 '선택'하지 않음)이 없다, 문제가 있습니다.

JTextArea에 마우스 클릭을 무시하는 방법이 있나요? 부모가 대신 처리 할 수 ​​있습니까?

radioButtonJTextArea의 수신기를 추가해 보았습니다.

또한 리스너를 완전히 제거하려고했지만이 두 시도는 모두 실패했습니다.

누구든지 의견이 있으십니까?

답변

1

강한

대부분의 JSomething을 조심 만들고 텍스트 영역

JPanel p = new JPanel(); 
JTextArea t = new JTextArea("line \n line"); 
t.addMouseListener(new MyMouseListener()); 
p.add(t); 
jRadioButton1.add(p); 
jRadioButton1.addMouseListener(new MyRadioButtonMouseListener()); 

하고 MyMouseListener 파견 이벤트에 자신의 MouseListener를 추가 할 수 있습니다 은 가능한 경우에도 컨테이너로 사용되는을 의미합니다. 어쨌든 그것을 수행 한 결과는 시각적으로나 행동 적으로 결정되지 않았습니다.

Windows 작업 대화 상자와 비슷한 것을 구현하는 것은 최근에 말한 바 있습니다. 요구 사항에 버튼을 클릭 할 수있게 유지하는 것이 포함되는 경우 (왜 컨테이너로 잘못 사용하는 것입니까? :-) 주요 문제 (레이아웃 분리)는 모든 추가 된 구성 요소를 완전히 마우스 투명하게 만드는 것입니다. 예상보다 어렵습니다. 최소가있는 MouseListener의 추가 허용 MouseEvent는의 수용 사용하지 않도록하는 것입니다 확인은 그럼에도 불구하고 끌어 툴팁

ToolTipManager.sharedInstance().unregisterComponent(area); 
area.setDragEnabled(false); 

등록을 취소

area.setEditable(false); 
area.setFocusable(false); 
area.setRequestFocusEnabled(false); 

플러스 포커스 아니다

final JTextArea area = new JTextArea("replacement ..") { 

    @Override 
    public synchronized void addMouseListener(MouseListener l) { 
     LOG.info("adding here ...?"); 
    } 

    @Override 
    public synchronized void addMouseMotionListener(
      MouseMotionListener l) { 
    } 

    @Override 
    public synchronized void addMouseWheelListener(
      MouseWheelListener l) { 
    } 

    @Override 
    public void addNotify() { 
     disableEvents(AWTEvent.MOUSE_EVENT_MASK | 
       AWTEvent.MOUSE_MOTION_EVENT_MASK | 
       AWTEvent.MOUSE_WHEEL_EVENT_MASK); 
     super.addNotify(); 
    } 
}; 

을 플러스 할, 여전히 놀라움이 계속 될지도 모른다. 두번 (즉 비활성화하고 다시 활성화), 내부적으로 할 다시 활성화 다음 된 MouseEvent 전화 : 그래서

area.setAutoscrolls(!area.getAutoscrolls()); 

을 하루의 끝에, 우리는 멀리 얻을 수 있습니다 -하지만 완전히 확신 할 수 없다 우리는 그 성공했다.

+0

안녕하세요! 신속한 답변을 해주셔서 대단히 감사합니다. 귀하의 솔루션은 완벽하게 작동했습니다! 또한 경고 해 주셔서 감사합니다. 나는 기회를 얻을 때 이것을 시도하고 더 좋은 방법을 찾는다. :) – Zee

0

어떨까요?

private class MyMouseListener implements MouseListener { 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     Component source = (Component) e.getSource(); 
     source.getParent().getParent().dispatchEvent(e); // 2x getParent() because JTextArea->JPanel->JRadio 
    } 
    . 
    . 
    . 
    } 

그리고 마지막으로 RadioButtonMouseListener

private class MyRadioButtonMouseListener implements MouseListener { 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("CLICK ON RADIOBUTTON !!"); 
    } 
. 
. 
. 
} 
+0

안녕하세요! 답변 해 주셔서 감사합니다.이것은 좋은 해결책 인 것 같습니다. 불행히도이 코드는 순간적으로 복잡해져 구현하기가 더 어려워졌습니다. 다시 한 번 감사드립니다 :) – Zee

+0

당신은 환영합니다;) –

관련 문제