首页 / JAVA / Java:定义鼠标事件的单元组件
Java:定义鼠标事件的单元组件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java:定义鼠标事件的单元组件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3787字,纯文字阅读大概需要6分钟。
内容图文
![Java:定义鼠标事件的单元组件](/upload/InfoBanner/zyjiaocheng/720/85d69867c513412d81103c61e5dd909d.jpg)
我想要一个名为mainPanel的JPanel并在其上添加几个组件;我还定义了一个mouseAdapter并添加到我的mainPanel,它覆盖mouseEntered和mouseExited,例如当鼠标输入时更改mainPanel的背景颜色.但是当鼠标进入mainPanel并输入到我添加的组件(例如标签)时,会调用mouseExited事件;但我不想这样,因为鼠标位于mainPanel区域;我想在鼠标退出mainPanel区域时调用它;并且想要这个用于mouseEntered.我以前将mouseListeners添加到mainPanel上的组件,但它不是一个明确的解决方案.谁能告诉我一个明确的方式来达到我的目的?
谢谢你的关注;
好锁
解决方法:
您希望在完全边界上调用mouseEntered和mouseExited.正如您所注意到的,这与“普通”MouseListener无法直接实现.
最简单的方法是将监听器添加到面板的所有子组件:
private static void addListenerToAllComponents(JComponent c, MouseListener l) {
c.addMouseListener(l);
for (Component cc : c.getComponents())
if (cc instanceof JComponent)
addListenerToAllComponents((JComponent) cc, l);
}
完整示例:
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.add(new JLabel("Testing"), BorderLayout.NORTH);
final JPanel panel = new JPanel(new GridLayout(2, 1));
panel.setBackground(Color.RED);
MouseListener l = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
panel.setBackground(Color.BLUE);
}
@Override
public void mouseExited(MouseEvent e) {
panel.setBackground(Color.RED);
}
};
panel.add(new JLabel("Hello"));
panel.add(new JTextField("World!"));
addListenerToAllComponents(panel, l);
frame.add(panel, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
另一种解决方法(上一个答案)……
…是设置GlassPane并自己检查边界:
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.add(new JLabel("Testing"), BorderLayout.NORTH);
final JPanel panel = new JPanel(new GridLayout(2, 1));
frame.add(panel, BorderLayout.CENTER);
panel.add(new JLabel("Hello"));
panel.add(new JTextField("World!"));
class GlassPane extends JComponent {
GlassPane(final JComponent c) {
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point p = SwingUtilities.convertPoint(e.getComponent(),
e.getPoint(),
c);
if (c.contains(p))
c.setBackground(Color.BLUE);
else
c.setBackground(Color.RED);
}
});
addMouseListener(new MouseAdapter() {
public void mouseExited(MouseEvent e) {
c.setBackground(Color.MAGENTA);
}
});
}
}
GlassPane glass = new GlassPane(panel);
frame.setGlassPane(glass);
glass.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
您需要查看一些内容…事件重新分配是一个,在您的情况下可能是一个问题.按照this example并在玻璃窗格上实现事件分发监听器:
MouseInputListener i = new MouseInputListener() {
private void redispatchMouseEvent(MouseEvent e) {
Point glassPanePoint = e.getPoint();
Container container = frame.getContentPane();
Point containerPoint = SwingUtilities.convertPoint(
GlassPane.this,
glassPanePoint,
container);
Component component =
SwingUtilities.getDeepestComponentAt(
container,
containerPoint.x,
containerPoint.y);
if (component != null) {
Point componentPoint = SwingUtilities.convertPoint(
GlassPane.this,
glassPanePoint,
component);
component.dispatchEvent(new MouseEvent(component,
e.getID(),
e.getWhen(),
e.getModifiers(),
componentPoint.x,
componentPoint.y,
e.getClickCount(),
e.isPopupTrigger()));
}
}
public void mouseMoved(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseDragged(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseClicked(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseEntered(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseExited(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mousePressed(MouseEvent e) {
redispatchMouseEvent(e);
}
public void mouseReleased(MouseEvent e) {
redispatchMouseEvent(e);
}
};
addMouseListener(i);
addMouseMotionListener(i);
内容总结
以上是互联网集市为您收集整理的Java:定义鼠标事件的单元组件全部内容,希望文章能够帮你解决Java:定义鼠标事件的单元组件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。