2

我将 a 添加JPanel到 a JRadioButton- 以便我可以在单选按钮中显示我想要的任何内容。

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

现在我有一个问题,如果用户单击JTextArea,则使用 ,JTextArea因此mouseEvent单选按钮没有响应(它没有“选择”)。

有没有办法让JTextArea忽略鼠标点击,以便父母可以处理它?

我尝试将JTextArea' 的侦听器添加到radioButton

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

有人有什么建议吗?

4

2 回答 2

2

强者当心

大多数 JSomething 并不打算用作容器,即使它是可能的——无论如何,这样做的结果或多或少在视觉和行为上是不确定的!

也就是说,最近做了它,以实现类似于 Windows 任务对话框的东西。如果要求包括保持按钮可点击(以及为什么你会误用它作为容器:-) 主要问题(布局分开)是使所有添加的组件完全鼠标透明。这比预期的要困难得多。最低要求是不允许添加 mouseListener 并禁用接受 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());

所以说到底,我们可能会侥幸逃脱——但永远不能完全确定我们成功了。

于 2013-04-05T14:30:45.060 回答
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 !!");
    }
.
.
.
}
于 2013-04-05T14:25:17.677 回答