Swing的大多数控件都已经实现了setToolTip接口,当鼠标悬停时会显示设置好的提示信息。但是当需要精确地显示复杂的提示信息时就力不从心。本文就介绍利用上下文菜单来显示复杂的提示信息。
首先需要解决在鼠标悬停时在何地显示提示信息的问题,这可以通过为控件添加MouseMotionListener来实现。通过MouseEvent的Point可以知道当前鼠标悬停的精确地点,再判断相对于控件的位置,从而得出是否需要显示提示信息。
其次当需要显示提示信息时,需要运用上下文菜单在相对控件的特定位置显示提示信息。 上下文菜单也是一个面板,可以设置布局管理器和添加控件,把所有的提示信息封装到一个JPanel里面,然后把该panel添加到菜单里面即可(BorderLayout居中)。具体代码如下。
1. table.addMouseMotionListener(new MouseMotionListener() {
2. @Override
3. public void mouseMoved(MouseEvent e) {
4. Point point = e.getPoint();
5. int rowIndex = table.rowAtPoint(point);
6. if (rowIndex > 0) {
7. new JPopupMenu();
8. new BorderLayout());
9. JPanel infoPanel = createtInfoPanel();
10. popup.add(infoPanel, BorderLayout.CENTER);
11.
12. int)point.getX(), (int)point.getY());
13. }
14. }
15.
16. @Override
17. public void mouseDragged(MouseEvent e) {
18.
19. }
20. });
1. private JPanel createtInfoPanel() {
2. new JPanel();
3. new MigLayout("", "[grow,fill]", "20[pref!]20");
4. infoPanel.setLayout(layout);
5.
6. new JLabel("Cool Thing"));
7.
8. return infoPanel;
9. }
通过以上方式,可以精确控制只有在特定的某一个位置才显示提示信息,比如某一列,或者某一特殊的单元格。也可以把复杂的提示信息放到面板中进行布局,style和显示。功能强大。
//新建一个button
JButton bt = new JButton();
//添加监听
bt.addMouseMotionListener(new MouseAdapter(){
public void mouseMoved(MouseEvent e) {
bt .setToolTipText("你想要显示的内容");
}
}
});
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.Rectangle;
public class HideButton extends JFrame {
private JPanel jPanel = null;
private JButton jButton = null;
/**
* This method initializes
*
*/
public HideButton() {
super();
initialize();
}
/**
* This method initializes this
*
*/
private void initialize() {
this.setSize(new Dimension(239, 129));
this.setContentPane(getJPanel());
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(null);
jPanel.add(getJButton(), null);
}
return jPanel;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(72, 29, 109, 39));
jButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent e) {
jButton.setVisible(false);
}
public void mouseExited(java.awt.event.MouseEvent e) {
jButton.setVisible(true);
}
});
}
return jButton;
}
public static void main(String args[]){
new HideButton().setVisible(true);
}
}
首先需要解决在鼠标悬停时在何地显示提示信息的问题,这可以通过为控件添加MouseMotionListener来实现。通过MouseEvent的Point可以知道当前鼠标悬停的精确地点,再判断相对于控件的位置,从而得出是否需要显示提示信息。
其次当需要显示提示信息时,需要运用上下文菜单在相对控件的特定位置显示提示信息。 上下文菜单也是一个面板,可以设置布局管理器和添加控件,把所有的提示信息封装到一个JPanel里面,然后把该panel添加到菜单里面即可(BorderLayout居中)。具体代码如下。
1. table.addMouseMotionListener(new MouseMotionListener() {
2. @Override
3. public void mouseMoved(MouseEvent e) {
4. Point point = e.getPoint();
5. int rowIndex = table.rowAtPoint(point);
6. if (rowIndex > 0) {
7. new JPopupMenu();
8. new BorderLayout());
9. JPanel infoPanel = createtInfoPanel();
10. popup.add(infoPanel, BorderLayout.CENTER);
11.
12. int)point.getX(), (int)point.getY());
13. }
14. }
15.
16. @Override
17. public void mouseDragged(MouseEvent e) {
18.
19. }
20. });
1. private JPanel createtInfoPanel() {
2. new JPanel();
3. new MigLayout("", "[grow,fill]", "20[pref!]20");
4. infoPanel.setLayout(layout);
5.
6. new JLabel("Cool Thing"));
7.
8. return infoPanel;
9. }
通过以上方式,可以精确控制只有在特定的某一个位置才显示提示信息,比如某一列,或者某一特殊的单元格。也可以把复杂的提示信息放到面板中进行布局,style和显示。功能强大。
//新建一个button
JButton bt = new JButton();
//添加监听
bt.addMouseMotionListener(new MouseAdapter(){
public void mouseMoved(MouseEvent e) {
bt .setToolTipText("你想要显示的内容");
}
}
});
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.Rectangle;
public class HideButton extends JFrame {
private JPanel jPanel = null;
private JButton jButton = null;
/**
* This method initializes
*
*/
public HideButton() {
super();
initialize();
}
/**
* This method initializes this
*
*/
private void initialize() {
this.setSize(new Dimension(239, 129));
this.setContentPane(getJPanel());
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(null);
jPanel.add(getJButton(), null);
}
return jPanel;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(72, 29, 109, 39));
jButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent e) {
jButton.setVisible(false);
}
public void mouseExited(java.awt.event.MouseEvent e) {
jButton.setVisible(true);
}
});
}
return jButton;
}
public static void main(String args[]){
new HideButton().setVisible(true);
}
}