gpt4 book ai didi

java - TopComponent 中动态添加的组件不会显示

转载 作者:行者123 更新时间:2023-12-02 06:58:26 25 4
gpt4 key购买 nike

我在使用 Netbean 平台 7.3 进行编程时遇到了一个非常奇怪的问题,基于 Geertjan 关于如何通过操作添加小部件的博客示例 ( https://blogs.oracle.com/geertjan/entry/add_widget_via_action_in ):

我创建了一个 TopComponent,我希望它在自定义 Pane 中显示自定义 ScrollPane 渲染图像。我的自定义 Scrollpane 在基本 Java Swing 应用程序中运行良好。

我尝试在 TopComponent 的构造函数中显示 Scrollpane,只是为了测试:

  public TopComponent()
{
super();
setBackground( Color.BLUE );
initComponents();
setName( Bundle.CTL_Scanmage2TopComponent() );
setToolTipText( Bundle.HINT_Scanmage2TopComponent() );
setImage( ImageHandlerFactory.getImageHandler( new File( ... ) ));
}

有 setImage 方法,ImageHandler 是我的一个描述图像的类:

public void setImage( ImageHandler handler ) throws Exception
{
pane = new Scrollpane(); // pane is a class field of type : Scrollpane

pane.setImage( handler ); // thats OK, the tiled image is loaded, etc.

setLayout( new BorderLayout() );

add( pane , BorderLayout.CENTER , 0 );

pane.revalidate(); // does not work
pane.repaint(); // does not work
}

一切正常,netbeans 应用程序启动,图像在应用程序中良好显示仅当从构造函数或从 componentOpened 调用 setImage 时。

现在,我将通过菜单加载图像,我实现了一个接口(interface),一个服务提供者,一切都OK。

从菜单操作中,我使用查找来查找具有通过从此操作生成的 ImageHandler 加载图像的方法的所有对象。

然后,通过 Lookup 调用 setImage(...) 不会执行任何操作,我的 TopComponent 绝对拒绝显示任何内容。

我尝试使用 FlowLayout,从而在 TopComponent 的顶部显示一个小的(大约 3x3 像素)的东西。

问题是:如何强制 TopComponent 绘制我放入其中的 Scrollpane(扩展 JScrollpane)?

我尝试重新验证/验证/无效/重新绘制/...TopComponent、Scrollpane,但没办法...

有什么想法吗?

谢谢!

-- 编辑 1/重新编辑:删除无用部分 --

Geertjan 的应用程序仍然可以正常工作,但是从按钮的操作中调用 setImage 方法不会执行任何操作。

这是该按钮的代码:

public void actionPerformed( ActionEvent e )
{
Lookup.Result<MyInterface > controllers = Lookup.getDefault().lookupResult( MyInterface .class );
Collection<? extends MyInterface > controllersColl = controllers.allInstances();
for( MyInterface c : controllersColl )
{
c.setImage( imgH ); // debug shows it passes heres and expected internal job is done
}
}

一切似乎都很顺利,对象已创建,等等,但 GUI 中没有任何可见的变化。

-- 编辑 2/重新编辑:删除无用部分 --

-- 编辑 3/Tan Hui Onn 回答后 --

确实,就是这样,谢谢 Tan Hui Onn:“您将获得另一个 TopComponent 实例”。

使用 TopComponent.getRegistry().getActivated() 即可完成这项工作。

最佳答案

我认为你不能通过@ServiceProvider获取打开的TopComponent。我认为您只会获得 TopComponent 的另一个实例。

为了进行测试,我在 OpenFileActionWhichDontWork.actionPerformed 中添加了这一行 ((ImageDisplayerCapability) MyModuleTopComponent.getRegistry().getActivated()).setImage(imgH); 。它显示了一些东西(但我不确定它是否正确)。

关于java - TopComponent 中动态添加的组件不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003475/

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