在运行时扩展类



我需要创建一个自定义的表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
}

最新更新