实例介绍
【实例截图】
【核心代码】
// -*- mode:java; encoding:utf-8 -*-
// vim:set fileencoding=utf-8:
// @homepage@
package example;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.Objects;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeSelectionModel;
public final class MainPanel extends JPanel {
private MainPanel() {
super(new BorderLayout());
JTree tree0 = new JTree(new DefaultTreeModel(makeTreeRoot())) {
@Override public void updateUI() {
super.updateUI();
setCellRenderer(new TooltipTreeCellRenderer());
}
};
ToolTipManager.sharedInstance().registerComponent(tree0);
JTree tree1 = new TooltipTree(new DefaultTreeModel(makeTreeRoot()));
ToolTipManager.sharedInstance().registerComponent(tree1);
JPanel p = new JPanel(new GridLayout(2, 1));
p.add(makeTitledPanel("Default location", tree0));
p.add(makeTitledPanel("Draw directly above the cell", tree1));
JSplitPane sp = new JSplitPane();
sp.setResizeWeight(.5);
sp.setLeftComponent(p);
sp.setRightComponent(new JLabel("dummy panel"));
add(sp);
setPreferredSize(new Dimension(320, 240));
}
private static DefaultMutableTreeNode makeTreeRoot() {
DefaultMutableTreeNode set4 = new DefaultMutableTreeNode("Set 00000004");
set4.add(new DefaultMutableTreeNode("222222111111111111111122222"));
set4.add(new DefaultMutableTreeNode("eeeeeeeeeeeee"));
set4.add(new DefaultMutableTreeNode("bbbbbbbbbbbb"));
set4.add(new DefaultMutableTreeNode("zzzzzzz"));
DefaultMutableTreeNode set1 = new DefaultMutableTreeNode("Set 00000001");
set1.add(new DefaultMutableTreeNode("33333333333333333333333333333333333"));
set1.add(new DefaultMutableTreeNode("111111111"));
set1.add(new DefaultMutableTreeNode("22222222222"));
set1.add(set4);
set1.add(new DefaultMutableTreeNode("222222"));
set1.add(new DefaultMutableTreeNode("222222222"));
DefaultMutableTreeNode set2 = new DefaultMutableTreeNode("Set 00000002");
set2.add(new DefaultMutableTreeNode("eeeeeeeeeeeee"));
set2.add(new DefaultMutableTreeNode("bbbbbbbbbbbb"));
DefaultMutableTreeNode set3 = new DefaultMutableTreeNode("Set 00000003");
set3.add(new DefaultMutableTreeNode("zzzzzzz"));
set3.add(new DefaultMutableTreeNode("aaaaaaaaaaaa"));
set3.add(new DefaultMutableTreeNode("ccccccccc"));
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
root.add(new DefaultMutableTreeNode("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
root.add(set3);
root.add(new DefaultMutableTreeNode("eeeeeeeeeeeeeeeeeeeeeeeeeeeee"));
root.add(set1);
root.add(set2);
root.add(new DefaultMutableTreeNode("22222222222222222222222222222222222"));
root.add(new DefaultMutableTreeNode("bbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
return root;
}
private static Component makeTitledPanel(String title, Component c) {
JScrollPane scroll = new JScrollPane(c);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createTitledBorder(title));
p.add(scroll);
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGui();
}
});
}
public static void createAndShowGui() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
Toolkit.getDefaultToolkit().beep();
}
JFrame frame = new JFrame("@title@");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class TooltipTree extends JTree {
private final JLabel label = new JLabel() {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = getRowHeight();
return d;
}
};
protected TooltipTree(TreeModel model) {
super(model);
}
@Override public void updateUI() {
super.updateUI();
// setRowHeight(24);
setCellRenderer(new TooltipTreeCellRenderer());
}
@Override public Point getToolTipLocation(MouseEvent e) {
Point p = e.getPoint();
int i = getRowForLocation(p.x, p.y);
Rectangle cellBounds = getRowBounds(i);
if (i >= 0 && Objects.nonNull(cellBounds) && cellBounds.contains(p.x, p.y)) {
TreeSelectionModel tsm = getSelectionModel();
Object node = getPathForRow(i).getLastPathComponent();
// System.out.println(node);
boolean hasFocus = hasFocus() && tsm.getLeadSelectionRow() == i;
boolean isLeaf = getModel().isLeaf(node);
TreeCellRenderer r = getCellRenderer();
Component tcr = r.getTreeCellRendererComponent(this, node, isRowSelected(i), isExpanded(i), isLeaf, i, hasFocus);
if (tcr instanceof JComponent && Objects.nonNull(((JComponent) tcr).getToolTipText())) {
// System.out.println(((JComponent) tcr).getToolTipText());
Point pt = cellBounds.getLocation();
// label.setBorder(BorderFactory.createLineBorder(Color.RED));
Insets ins = label.getInsets();
pt.translate(-ins.left, -ins.top);
label.setIcon(new RendererIcon(tcr, cellBounds));
// System.out.println(pt);
return pt;
}
}
return null;
}
// @Override public String getToolTipText(MouseEvent e) {
// String str = super.getToolTipText(e);
// System.out.println("getToolTipText: " str);
// return str;
// }
@Override public JToolTip createToolTip() {
JToolTip tip = new JToolTip() {
@Override public Dimension getPreferredSize() {
return label.getPreferredSize();
}
};
// System.out.println("createToolTip");
tip.setBorder(BorderFactory.createEmptyBorder());
tip.setLayout(new BorderLayout());
tip.setComponent(this);
tip.add(label);
return tip;
}
}
class TooltipTreeCellRenderer implements TreeCellRenderer {
private final TreeCellRenderer renderer = new DefaultTreeCellRenderer();
@Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
JLabel l = (JLabel) renderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
l.setToolTipText(value == null ? null : value.toString());
// Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, tree);
// if (c instanceof JScrollPane) {
// Insets i = l.getInsets();
// Rectangle rect = ((JScrollPane) c).getViewportBorderBounds();
// FontMetrics fm = l.getFontMetrics(l.getFont());
// String str = Objects.toString(value, "");
// l.setToolTipText(fm.stringWidth(str) > rect.width ? str : null);
// }
return l;
}
}
class RendererIcon implements Icon {
private final Component renderer;
private final Rectangle rect;
protected RendererIcon(Component renderer, Rectangle rect) {
this.renderer = renderer;
this.rect = rect;
rect.setLocation(0, 0);
}
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
if (c instanceof Container) {
Graphics2D g2 = (Graphics2D) g.create();
g2.clearRect(0, 0, c.getWidth(), c.getHeight());
// g2.translate(x, y);
SwingUtilities.paintComponent(g2, renderer, (Container) c, rect);
g2.dispose();
}
}
@Override public int getIconWidth() {
return renderer.getPreferredSize().width;
}
@Override public int getIconHeight() {
return renderer.getPreferredSize().height;
}
}
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论