怎样在jTree中获取鼠标点击的焦点

Pretty_Girl_mm 2005-10-28 07:41:24
jTree中本来不用编码就可以自动的获取鼠标点击的焦点,但是我使用了TreeCellRenderer接口来画图标。
画上图标后用鼠标点击树的节点,却不能获取焦点了。请问是怎么回事,我的代码如下:

// 图标生成类
protected class MyTreeCellRenderer extends JPanel implements
TreeCellRenderer {

JLabel label = new JLabel();

public MyTreeCellRenderer() {
this.add(label);
label.setBackground(UIManager.getColor("Tree.textBackground"));
this.setBackground(UIManager.getColor("Tree.textBackground"));
}

public Dimension getPreferredSize() {
Dimension labelDimension = label.getPreferredSize();
return new Dimension(
labelDimension.width,
labelDimension.height);
}

public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
String stringValue = tree.convertValueToText(value, sel, expanded,
leaf, row, hasFocus);
label.setFont(tree.getFont());
// 设置图标为系统的文件类型图标
FileSystemView fileSystemView = FileSystemView.getFileSystemView();
label.setIcon(fileSystemView.getSystemIcon(((FileNode) value)
.getFile()));
label.setText(stringValue);
return this;
}

public void doLayout() {
Dimension labelDimension = label.getPreferredSize();
label.setLocation(0, 0);
label.setBounds(0, 0, labelDimension.width,
labelDimension.height);
}
}
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2005-10-31
  • 打赏
  • 举报
回复
好多年没玩swing,可能代码都记不清了,建议参考swing里面默认的那个javax.swing.tree.DefaultTreeCellRenderer


public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {


...
if (...) { //回调的时候,会传一些列状态参数,具体那个就...可能hasFocus
label.requestFocus(); //或者类似你需要的效果的代码,需要自己手工改变这个控件状态
}
Mark_Chen 2005-10-31
  • 打赏
  • 举报
回复
up!!
Pretty_Girl_mm 2005-10-31
  • 打赏
  • 举报
回复
现在比较清楚了,应该在getTreeCellRendererComponent()这个函数内设置我想要显示的Focus吧。
但是具体该怎么做就不太清楚了,希望大哥能写点东东出来。
shine333 2005-10-31
  • 打赏
  • 举报
回复
听说过MVC吗,其实Swing也是一种MVC,你的TreeModel就是Model,只负责数据,你的Renderer就是View只负责和显示有关的部分。因此,你的控件获得焦点,并且显示出来这个功能,应当由你的view层也就是renderer自己负责
Pretty_Girl_mm 2005-10-31
  • 打赏
  • 举报
回复
明白一点,但还不是很清楚^-^
shine333 2005-10-31
  • 打赏
  • 举报
回复
让你参考javax.swing.tree.DefaultTreeCellRenderer阿,这个里面就是默认的Renderer

它(DefaultTreeCellRenderer)是is a JLabel,而你是has a JLabel

所以你只要将他this.setXXX改为label.setXXX就可以了阿
shine333 2005-10-31
  • 打赏
  • 举报
回复
swing里面,所有的Renderer的接口方法,会把所有状态参数传过来,调用者不会改变这个Component的状态,而是让Renderer自己根据状态参数改变返回的控件的显示

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧