簡體   English   中英

允許父母處理鼠標事件

[英]Allow parent to handle mouse event

我添加了一個JPanelJRadioButton -這樣我可以顯示任何我想要的單選按鈕。

這一切都按預期進行。 但是為了允許自動換行,我使用了JTextArea並將其添加到單選按鈕中包含的JPanel中。

現在,我遇到一個問題,如果用戶單擊JTextArea ,則JTextArea消耗mouseEvent ,結果單選按鈕沒有響應(它不會“選擇”)。

有沒有辦法讓JTextArea忽略鼠標單擊,以便父級可以代替它處理?

我嘗試將JTextArea的偵聽器添加到radioButton

我也嘗試完全刪除其偵聽器,但這些嘗試均失敗。

有人有什么建議嗎?

謹防

即使有可能,大多數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());

因此,總而言之,我們可能會擺脫它-但永遠不能完全確定我們是否成功。

那這個呢? 創建自己的MouseListener並將其添加到TextArea

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 Dispatch事件中

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 !!");
    }
.
.
.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM