【问题标题】:Service loader in java loading modules but can display loaded views properlyjava加载模块中的服务加载器,但可以正确显示加载的视图
【发布时间】:2014-02-02 10:28:08
【问题描述】:

所以我的应用程序有一个主项目,它加载所有实现 IModule 的类。每个模块都有一个扩展 AbstractView 的视图。这是示例代码

public abstract class AbstractView extends JPanel{
    //Init panel
}
public Module implements IModule{
   public AbstractView getView(){
       return some class that extends AbstractView;
   }
   public String getModuleName(){
       return "ModuleName";
   }
}

public Application{
   ServiceLoader<IModules> modules; //Loaded at start of application
   public void displayModule(String moduleName){
       Iterator<IModule> moduleIterator = modules.iterator();
       while (moduleIterator.hasNext()) {
            if (module.getModuleName() == moduleName) {
               display(module.getView());
            }
   }
   public void display(AbstractView view){
      displayPanel.add(view, Borderlayout.Center);
      displayPanel.repaint();
   }
}

它只是一个简化的例子,但这就是它的工作原理。我的问题是我无法显示插件视图。我不知道为什么这不起作用。当我打印加载的视图时,我得到了扩展该 AbstractView 的类,其属性如布局类型等。实现与 UI 无关的接口的类似乎没有问题 atm。我从包含它们各自的 jar 文件的文件夹中加载插件。

编辑

在我的 META-INF/services 中,我只有 app.IModule 文件,其中包含文本 plugin.Plugin。插件类是实现 IModule 的类。这是我声明的唯一服务,因为它是服务加载器将加载的类。我是否也必须声明扩展 AbstractView 的类?即使没有在服务加载器中加载它

【问题讨论】:

  • 会发生什么?你有例外吗?什么都没发生? ...?
  • 什么也没发生。即使重绘也不会显示。我实际上将视图添加到 displayPanel。它就像 displayPanel.addComponent(view, Borderlayout.Center)

标签: java serviceloader


【解决方案1】:

这有点尴尬。当我只忘记 displayPanel.validate();.... 对此感到抱歉时,我花了两个小时来解决这个问题

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 2014-02-18
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2012-01-22
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多