允许父级处理鼠标事件

时间:2013-04-05 13:28:53

标签: java swing

我在JPanel添加了JRadioButton - 这样我就可以在单选按钮中显示我想要的内容。

这一切都按预期工作。但是为了允许文本换行,我使用JTextArea并将其添加到单选按钮中包含的JPanel

现在我遇到一个问题,如果用户点击JTextArea,则JTextArea会消耗mouseEvent,因此单选按钮没有响应(它没有'选择')。

是否有办法让JTextArea忽略鼠标点击,以便父母可以处理它?<​​/ p>

我尝试将JTextArea的听众添加到radioButton

我也试图完全删除它的侦听器,但这两次尝试都失败了。

有人有任何建议吗?

2 个答案:

答案 0 :(得分: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);

尽管如此,未来可能会有惊喜,f.i。调用以下两次(即禁用并再次启用),这将在内部重新启用mouseEvent:

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

所以在一天结束的时候,我们可能会侥幸逃脱 - 但永远不能完全确定我们是否成功了。

答案 1 :(得分:0)

这个怎么样?创建并将自己的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 !!");
    }
.
.
.
}