我需要创建一个自定义的表UI。为了将来的灵活性,我宁愿在JTable.updateUI()
结束时将调用返回的任何对象扩展到UIManager.getUI()
。所以,直到运行时,我才知道这个类的名称或路径。
这可能吗?我该怎么做?我从来没有做过任何与反思有关的事情,所以如果涉及到这一点,请对我温和一点:-)我在这里看了其他类似的问题,但它们似乎都不是我需要的,也不是可以理解的。对不起,如果我错过了什么:-)
编辑:我认为我需要使用的结构如下(这将在我的JTable
子代中进行):
@Override
public void updateUI()
{
super.updateUI();
ComponentUI theUI = UIManager.getUI(this)[extended in some way with an overriding paint(){....}]
setUI((TableUI)theUI);
}
我缺少的是方括号中部分的语法。我脑海中的东西有点像匿名的内部类声明,也许是:
...
ComponentUI theUI = UIManager.getUI(this)
{
public void paint(Graphics g, JComponent c)
{
...
}
}
我并不是说存在上述情况,但有什么方法可以实现吗?
如果这就是你的意思:
您可以在运行时使用class.forName加载类。示例:假设我们有一个接口A,它定义了函数foo(),并有许多类实现它。对于所有的类都有相同的构造函数是很重要的(可以不用它,但它将是非常复杂的逻辑)
在运行时,我们会得到要使用的类的名称和可能的路径(或者通过其他方式我们已经知道我们的类应该在哪里)。所以我们可以这样做:
String class = getPath();
Class<?> toUse = Class.forName(class);
A instance = (A) toUse.getConstructors()[0].newInstance(args);
instance.foo(); //TADA
操作编辑后:好吧,你的问题现在更清楚了,我怀疑我的解决方案是否是你想要的。您可以创建一个类来组成ComponentUI,并使用它来扩展您需要的任何内容。
像这样的事情(真的不确定它是否有帮助,因为我对整个JPanel一无所知,等等,一开始认为这个问题是一个mroe通用的问题):
class B { //maybe class should extend or implement something, depends on what exactly is required
private ComponentUI c;
//other fields
public B(ComponentUI c) {
this.c = c;
//other stuff you need done
}
//other methods you might need
}