2013-04-05 107 views
2

我在JRadioButton上添加了JPanel - 這樣我就可以在單選按鈕上顯示任何我想要的東西。允許家長處理鼠標事件

這一切都按預期工作。但爲了允許文字換行,我使用了JTextArea並將其添加到單選按鈕中包含的JPanel

現在我已經在那裏,如果用戶點擊JTextArea,那麼JTextArea消耗mouseEvent,因此沒有從單選按鈕響應(它不「選擇」)的問題。

有沒有辦法讓JTextArea忽略鼠標點擊,以便父母可以處理它呢?

我試過把JTextArea的聽衆加入radioButton

我也嘗試完全刪除它的聽衆,但這兩個嘗試失敗。

任何人有任何建議嗎?

回答

1

強提防

大多數JSomething不的意思是即使有可能用作容器 - 無論如何,其結果無論如何都是視覺上和行爲上的不確定性!

也就是說,最近做了一個實現類似於Windows任務對話框的東西。如果需求包括保持按鈕可點擊(以及爲什麼你會誤用它作爲容器:-)主要問題(佈局除外)是使所有添加的組件完全鼠標透明。這比預期的更困難。最低是不允許添加mouseListeners和禁用接受mouseEvents的:

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

另外要確保它不是可聚焦

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

加註銷拖動和工具提示

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

儘管如此, fi可能還會有驚喜調用下面的兩倍(即禁用和重新啓用),這將在內部重新啓用的MouseEvent:

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

因此,在這一天結束的時候,我們可能逃脫它 - 但絕不是完全肯定的是,我們成功了。

+0

你好!非常感謝您的快速響應。你的解決方案完美運作另外,感謝您的警告。我會嘗試找到一個更好的方式來做到這一點,當我有機會:) – Zee 2013-04-05 15:01:56

0

這是怎麼回事?創建並添加自己的MouseListener到文本區

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調度事件

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 2013-04-05 15:03:12

+0

不客氣;) – 2013-04-05 15:16:27