Con*_*orR 6 java swing awt awt-eventqueue
在帮助系统上工作,我希望每个组件在鼠标悬停时提供一些帮助并且"?" 键是按下的.有点像工具提示,除了更广泛的帮助 - 基本上一个小的Web浏览器旨在弹出和显示文本,图像或更多.
我发现无论鼠标在哪里,输入总是转到同一个KeyListener.是否应该一次只有一个活动?
对于它的价值,这是现在正在运行的版本 - 感谢您的建议!
/**
* Main class JavaHelp wants to support a help function so that when
* the user types F1 above a component, it creates a popup explaining
* the component.
* The full version is intended to be a big brother to tooltips, invoking
* an HTML display with clickable links, embedded images, and the like.
*/
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class Respond2Key extends AbstractAction
{
Component jrp;
// Contract consructor
public Respond2Key( String text)
{
super( text );
}
// Constructor that makes sure it gets done right
public Respond2Key( String text, Component jrpIn)
{
super( text );
System.out.println( "creating Respond2Key with component " + jrpIn
.toString
() );
jrp = jrpIn;
}
public void setJrp( Component j) {
jrp = j;
}
// Functionality: what is the response to a key
public void actionPerformed(ActionEvent e)
{
// use MouseInfo to get position, convert to pane coords, lookup component
Point sloc = MouseInfo.getPointerInfo().getLocation();
SwingUtilities.convertPointFromScreen( sloc, (Component) jrp );
Component c = jrp.getComponentAt( sloc );
System.out.printf( "Mouse at %5.2f,%5.2f Component under mouse is %s\n",
sloc.getX(), sloc.getY(), c.toString() );
}
}
//----------------------------------------------------------------
// The main class
//----------------------------------------------------------------
public class JavaHelp extends JFrame
{
// The object constructor
public JavaHelp()
{
// Start construction
super( "Help System" );
this.setSize( 640, 480 );
Container contents = 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 = pane( "hello", 100, 100 );
JPanel p2 = pane( "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",
new Respond2Key("frame",(Component)contents)
);
this.setVisible( true );
this.requestFocus();
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// Inner classes for instantiating and listening to button, and panel.
class ButtonListener implements ActionListener
{
private String label = null;
public void setLabel(String s) {label = s;}
public void actionPerformed(ActionEvent e)
{
System.out.printf( "Dealing with event labeled %s source %s\n\n",
label,
e.getSource().toString() );
}
}
// def butt( from, name, w, h) = new Jbutton (...)
protected JButton butt( String s, int w, int h)
{
JButton b = new JButton( s );
b.setSize( w, h );
ButtonListener oj = new ButtonListener();
oj.setLabel( s );
b.addActionListener( oj );
return (b);
}
// def pane = new Jpanel(...)
protected JPanel pane(String name, int w, int h)
{
JPanel p = new JPanel();
p.setMinimumSize( new Dimension( w, h ) );
p.add( new Label( name ) );
p.setBackground( Color.black );
p.setForeground( Color.red );
return (p);
}
//--------------------------------
public static void main(String[] args)
{
JavaHelp jh = new JavaHelp();
}
}
输入始终发送至同一个 KeyListener。
KeyEvent 始终被分派给具有焦点的组件,鼠标位置与按键事件的生成方式无关。
您应该使用Key Bindings. 当您使用按键绑定时,您可以通过将绑定添加到 JFrame 的根窗格来在每次生成 KeyStroke 时调用操作。请阅读 Swing 教程中有关键绑定的部分以获取更多信息。
现在在您创建的用于侦听“?”的操作中 KeyStroke 然后您可以:
MouseInfo获取当前鼠标位置。SwingUtilities.convertPointFromScreen(...)将鼠标点转换为相对于根窗格的位置Conatiner.getComponentAt(...)获取鼠标悬停的实际组件