分享
 
 
 

DISPLAYING ELEMENT-LEVEL TOOL TIPS FOR SWING COMPONENTS

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

DISPLAYING ELEMENT-LEVEL TOOL TIPS FOR SWING COMPONENTS

Tool tips are those little popup windows that appear when you rest your mouse pointer over a control such as a button or list. All Swing components support tool tips. To establish a tool tip for a control, call setToolTipText() for the component. When a user rests the mouse pointer over the control, the tool tip automatically appears. Typically, you want one text string for an entire component. But there can be times when you want the text to be more flexible. For instance, in the case of a JList, JTree, or JTable component, you might want to display tool tip text based on which list entry, tree node, or table cell the mouse pointer is over. How can you customize the text?

There are two ways you can create custom tool tips for these Swing components. You can customize the control and override the public String getToolTipText(MouseEvent event) method, or you can customize the renderer for the control and let the renderer deal with the tool tips.

If you decide to override the getToolTipText() method, you have to understand that the passed-in MouseEvent contains the mouse coordinates over the control. It is your responsibility to determine what element the cursor is on. Then, you have to look up the appropriate tool tip text for the element and return that text. You must then manually register the component with the ToolTipManager. If you called the setToolTipText() method for the control, a call to the registerComponent() method of ToolTipManager would have been done for you, but because you don't need to call setToolTipText(), you must do the registration yourself.

Here's an example that demonstrates this first approach. The example uses the keys for the system properties (such as java.runtime.name) as the list entries. The example uses the property values (such as Java 2, Runtime Environment, Standard Edition) as the tool tip text for those entries.

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

public class ListTest extends JList {

DefaultListModel model;

Properties tipProps;

public ListTest(Properties props) {

model = new DefaultListModel();

setModel(model);

ToolTipManager.sharedInstance().registerComponent(

this);

tipProps = props;

Enumeration enum = props.propertyNames();

while (enum.hasMoreElements()) {

model.addElement(enum.nextElement());

}

}

public String getToolTipText(MouseEvent event) {

Point p = event.getPoint();

int location = locationToIndex(p);

String key = (String)model.getElementAt(

location);

String tip = tipProps.getProperty(key);

return tip;

}

public static void main (String args[]) {

JFrame frame = new JFrame("Custom Tips");

frame.setDefaultCloseOperation(

JFrame.EXIT_ON_CLOSE);

Properties props = System.getProperties();

ListTest list = new ListTest(props);

JScrollPane scrollPane = new JScrollPane(list);

frame.getContentPane().add(scrollPane);

frame.setSize(300, 300);

frame.show();

}

}

If you decide instead to customize the cell renderer, you have to do a little more work at first, but you don't have to determine what element is under the mouse at run time. If you find that the tool tips are hardly used, though, this extra work might not be necessary. That's because getting cell renderers happens frequently, and the tool tip setup happens every time the cell is rendered. It might be better to use the first mechanism. Essentially, what it involves is calling the setToolTipText() method for the cell renderer.

Here's an example that demonstrates the cell renderer approach. The example is taken from the book "John Zukowski's Definitive Guide to Swing for Java 2, Second Edition" published by Apress.

First the renderer: this code essentially reuses a DefaultTreeCellRenderer as the renderer, setting its tip text.

import javax.swing.*;

import javax.swing.tree.*;

import java.awt.*;

import java.util.*;

public class ToolTipTreeCellRenderer

implements TreeCellRenderer {

DefaultTreeCellRenderer renderer =

new DefaultTreeCellRenderer();

Dictionary tipTable;

public ToolTipTreeCellRenderer (

Dictionary tipTable) {

this.tipTable = tipTable;

}

public Component getTreeCellRendererComponent(

JTree tree, Object value, boolean selected,

boolean expanded, boolean leaf, int row,

boolean hasFocus) {

renderer.getTreeCellRendererComponent(

tree, value, selected, expanded, leaf, row,

hasFocus);

if (value != null) {

Object tipKey;

if (

value instanceof DefaultMutableTreeNode) {

tipKey =

((DefaultMutableTreeNode)value).getUserObject();

} else {

tipKey = tree.convertValueToText(value,

selected, expanded, leaf, row, hasFocus);

}

Object tip = tipTable.get(tipKey);

if (tip != null) {

renderer.setToolTipText(tip.toString());

} else {

renderer.setToolTipText(null);

}

}

return renderer;

}

}

The test program then just registers the tree with the ToolTipManager and registers the renderer. There is no need to subclass JTree. Like the JList example, the system properties are used for the component elements. In this case, the tree is only one level deep.

import javax.swing.*;

import javax.swing.tree.*;

import java.awt.*;

import java.util.*;

public class TreeTips {

public static void main(String args[]) {

JFrame frame = new JFrame("Custom Tree Tips");

frame.setDefaultCloseOperation(

JFrame.EXIT_ON_CLOSE);

Properties props = System.getProperties();

JTree tree = new JTree(props);

ToolTipManager.sharedInstance().registerComponent(

tree);

TreeCellRenderer renderer =

new ToolTipTreeCellRenderer(props);

tree.setCellRenderer(renderer);

JScrollPane scrollPane = new JScrollPane(tree);

frame.getContentPane().add(

scrollPane, BorderLayout.CENTER);

frame.setSize(300, 150);

frame.setVisible(true);

}

}

<!-- Black Horizontal Line Begins Here -->

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有