2012-03-30 29 views
2

我有一个JTree,我试图修改它,以便任何选定节点的实际选择区域将从JTree的最左侧延伸到JTree的右侧。JTree:修改外观而不管L&F

Web上的大多数示例都会介绍如何扩展BasicTreeUI。从那里你只需修改决定选择区域的方法,就是这样。但是,这将要求JTree - 无论运行哪个平台 - 都将使用该实现。我将无法真正能够利用针对特定平台的各种UI实现,因为我将始终使用BasicTreeUI(而不是Metal,Windows或Aquia实现)。

我理想能够做的就是采用当前安装在JTree上的BasicTreeUI的任何实现,并将其包装在我的扩展BasicTreeUI的自定义包装中。从那里我将覆盖所有的方法和委托给包装的用户界面,并在需要重新计算节点选择区域时自己实现一些方法。但是,BasicTreeUI上的大多数方法都受到保护,因此我可以真正做到这一点。

不知道如何解决这个问题...任何想法都会受到欢迎!

+0

“但是,BasicTreeUI上的大多数方法都受到保护” - 如果它们受到保护,那么您可以覆盖它们,您的意思是'private'吗? – 2012-03-31 00:39:09

回答

2

也许你可以重写setUI和包装提供的UI在您的自定义UI的树,像这样:

@Override 
public void setUI(TreeUI ui) { 
    super.setUI(new MyCustomTreeUI(ui)); 
} 

另一种选择要考虑的是寻找到提供/全球UIManager设置树的用户界面特性。我相信特定于平台的树UI会询问全球的UIManager属性值并相应地进行自我配置 - 也许您可以简单地执行诸如UIManager.put("Tree.selectionWidth", 100)之类的操作。

+0

感谢您的建议。但是,它不会真正起作用,因为MyCustomTreeUI将不能覆盖提供的ui实例所需的方法,因为它们受到保护。具体来说,我期望修改决定节点大小的任何尺寸的BasicTreeUI#createNodeDimensions()方法。 – sbrattla 2012-03-31 09:13:24

+0

尽管你可以重写'protected'方法。 – 2012-03-31 09:20:50

+0

如果您无法向课程所在的包添加任何内容,您将如何覆盖受保护的方法? – sbrattla 2012-03-31 14:09:36