gpt4 book ai didi

java - 在运行时扩展类

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:27 28 4
gpt4 key购买 nike

我需要创建一个自定义表格 UI。为了将来的灵 active ,我宁愿扩展在 JTable.updateUI() 末尾调用 UIManager.getUI() 返回的任何对象。因此,直到运行时我才知道该类的名称或其路径。

这可能吗?我该怎么做?我从来没有做过任何与反射(reflection)有关的事情,所以如果涉及到这一点,请对我温柔一些:-)我在这里查看了其他类似的问题,但它们似乎都不是我需要的,或者是我需要的。可以理解的方式。抱歉,如果我错过了什么:-)

编辑:我认为我需要使用的结构是这样的(这将出现在我的 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 在运行时加载类。例子:假设我们有一个接口(interface) A,它定义了 functiong foo() 并有许多实现它的类。重要的是所有类都有相同的构造函数(没有它也可以,但逻辑会非常复杂)

在运行时,我们获取要使用的类的名称和可能的路径(或者我们已经通过其他方式知道我们的类应该在哪里)。所以我们可以这样:

String class = getPath();
Class<?> toUse = Class.forName(class);
A instance = (A) toUse.getConstructors()[0].newInstance(args);
instance.foo(); //TADA

操作编辑后:好吧,你的问题现在更清楚了,我怀疑我的解决方案就是你正在寻找的。您也许可以创建一个类来组成 ComponentUI 并使用它来扩展您需要的任何内容。

这样的东西(真的不确定它是否有帮助,因为我对整个 JPanel 不了解,一开始认为这个问题是一个非常普遍的问题):

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
}

关于java - 在运行时扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26624795/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com