在帮助系统上工作时,我希望每个组件在鼠标悬停在其上以及“?”上方时提供一些帮助。按键。有点像工具提示,但需要更多的帮助-本质上是一个小的网络浏览器旨在弹出并显示文本,图像或更多内容。

我发现的是,无论鼠标在哪里,输入都始终输入相同的KeyListener。一次只能参加一次活动吗?

值得的是,这是现在可以使用的版本-感谢您的建议!

/ **
*主类JavaHelp希望支持帮助功能,以便在
*用户在组件上方键入F1,它将创建一个弹出说明
*组件。
*完整版旨在成为工具提示的老大哥,
*带有可点击链接,嵌入式图像等的HTML显示。
* /

导入javax.swing。*;
导入javax.swing.border.Border;
导入java.awt。*;
导入java.awt.event。*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;

类Respond2Key扩展AbstractAction
{
组件jrp;

//合同负责人
公共Respond2Key(字符串文本)
{
超(文本);
}

//确保正确完成的构造函数
公共Respond2Key(字符串文本,组件jrpIn)
{
超(文本);
System.out.println(“使用组件” + jrpIn创建Respond2Key
.toString
());
jrp = jrpIn;
}

公共无效setJrp(组件j){
jrp = j;
}

//功能:对键的响应是什么
公共无效actionPerformed(ActionEvent e)
{
//使用MouseInfo获取位置,转换为窗格坐标,查找组件
点sloc = MouseInfo.getPointerInfo()。getLocation();

SwingUtilities.convertPointFromScreen(sloc,(Component)jrp);

组件c = jrp.getComponentAt(sloc);
System.out.printf(“鼠标位于%5.2f,%5.2f处,鼠标下的组件为%s \ n”,
sloc.getX(),sloc.getY(),c.toString());
}
}

// ------------------------------------------------ ----------------
//主类
// ------------------------------------------------ ----------------
公共类JavaHelp扩展JFrame
{
//对象构造函数
公共JavaHelp()
{
//开始施工
超级(“帮助系统”);
this.setSize(640,480);
容器内容= getContentPane();
contents.setLayout(new FlowLayout());

JButton b1 = butt(“button1”,64,48);
JButton b2 = butt(“button2”,96,48);
JButton b3 = butt(“button3”,128,48);
JPanel p1 =窗格(“hello”,100,100);
JPanel p2 =窗格(“world”,200,100);

contents.add(b1);
contents.add(p1);
contents.add(b2);
contents.add(p2);
contents.add(b3);

JRootPane jrp = this.getRootPane();
jrp.getInputMap(jrp.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke(“F1”),“helpAction”);
jrp.getActionMap()。put(“helpAction”,
新的Respond2Key(“frame”,(Component)contents)
);
this.setVisible(true);
this.requestFocus();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//用于实例化和监听按钮和面板的内部类。
ButtonListener类实现ActionListener
{
私有字符串标签= null;

公共无效setLabel(String s){label = s;}

公共无效actionPerformed(ActionEvent e)
{
System.out.printf(“处理带有%s源%s \ n \ n的事件,”
标签,
e.getSource()。toString());
}

}

// def butt(from,name,w,h)= new Jbutton(...)
受保护的JButton屁股(String s,int w,int h)
{
JButton b =新的JButton(s);
b.setSize(w,h);
ButtonListener oj = new ButtonListener();
oj.setLabel(s);
b.addActionListener(oj);
返回(b);
}

// def窗格= new Jpanel(...)
受保护的JPanel窗格(字符串名称,int w,int h)
{
JPanel p =新的JPanel();
p.setMinimumSize(new Dimension(w,h));
p.add(new Label(name));
p.setBackground(Color.black);
p.setForeground(Color.red);
返回(p);
}

// --------------------------------
公共静态void main(String [] args)
{
JavaHelp jh = new JavaHelp();
}

}

最佳答案

输入总是转到相同的KeyListener。

始终将KeyEvent分配给具有焦点的组件,鼠标位置与键事件的生成方式无关。

您应该使用Key Bindings而不是使用KeyListener。使用键绑定时,只要将绑定添加到JFrame的根窗格中,就可以在生成KeyStroke时调用Action。阅读Swing教程中有关Key Bindings的部分,以获取更多信息。

现在在您创建的操作中侦听“?”然后,您可以:

  • 使用MouseInfo类获取当前鼠标位置。
  • 使用SwingUtilities.convertPointFromScreen(...)将鼠标点转换为相对于根窗格
  • ,然后您可以使用Conatiner.getComponentAt(...)获取鼠标悬停在
  • 上的实际组件
  • 一旦知道组件,就可以显示帮助信息。
  • 07-24 22:33