我在JPanel
添加了JRadioButton
- 这样我就可以在单选按钮中显示我想要的内容。
这一切都按预期工作。但是为了允许文本换行,我使用JTextArea
并将其添加到单选按钮中包含的JPanel
。
现在我遇到一个问题,如果用户点击JTextArea
,则JTextArea
会消耗mouseEvent
,因此单选按钮没有响应(它没有'选择')。
是否有办法让JTextArea
忽略鼠标点击,以便父母可以处理它?</ p>
我尝试将JTextArea
的听众添加到radioButton
。
我也试图完全删除它的侦听器,但这两次尝试都失败了。
有人有任何建议吗?
答案 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 !!");
}
.
.
.
}