java - JFace MasterDetailsPart - 详细信息页面未显示

标签 java eclipse swt rcp jface

我第一次使用 JFace MasterDetailsPart 时遇到了一些问题。未显示详细信息页面 - 当我选择新项目时,不会触发该事件。 我找不到任何好的示例或教程,甚至 JavaDoc 也无法帮助我。

详细信息部分只是在初始化时实现了 IDetailsPart 和 SYSOUT 的消息(如图所示),但未显示标签:这是详细信息部分代码:

public class Einzelansicht implements IDetailsPage{

    public Einzelansicht() {
        // TODO Auto-generated constructor stub

    }


    @Override
    public void commit(boolean arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public void initialize(IManagedForm arg0) {
        System.out.println("initialize");



    }

    @Override
    public boolean isDirty() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isStale() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void refresh() {
        // TODO Auto-generated method stub

    }

    @Override
    public void setFocus() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean setFormInput(Object arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void selectionChanged(IFormPart arg0, ISelection arg1) {
System.out.println("!!");

    }

    @Override
    public void createContents(Composite arg0) {
        arg0.setLayout(new GridLayout());
        Label label = new Label(arg0, 0);
        label.setText("Einzel");

    }

}

我想,非常简单,这里没有什么特别的地方应该会失败。现在是我的 MasterDetaislBlock:

public class BlockZwei extends MasterDetailsBlock {

    private FormToolkit toolkit;
    private IManagedForm form;

    /**
     * Create the master details block.
     */
    public BlockZwei() {
        // Create the master details block
    }

    /**
     * Create contents of the master details block.
     * 
     * @param managedForm
     * @param parent
     */
    @Override
    protected void createMasterPart(final IManagedForm managedForm,
            Composite parent) {
        toolkit = managedForm.getToolkit();
        //
        form = managedForm;

        final TableViewer tableViewer = new TableViewer(parent);
        ArrayContentProvider arrayContent = ArrayContentProvider.getInstance();
        tableViewer.setContentProvider(arrayContent);
        String[] strings = new String[] { "Eins", "Zwei" };
        tableViewer.setInput(strings);
        tableViewer
                .addSelectionChangedListener(new ISelectionChangedListener() {

                    @Override
                    public void selectionChanged(SelectionChangedEvent arg0) {
                        managedForm.fireSelectionChanged(detailsPart, arg0.getSelection());



                    }
                });
    }
    /**
     * Register the pages.
     * 
     * @param part
     */
    @Override
    protected void registerPages(DetailsPart part) {
        part.registerPage(Einzelansicht.class, new Einzelansicht());


    }

如您所见,我为选择注册了一个监听器,据我所知,该事件应该触发详细信息页面上的事件。 最后但并非最不重要的一点是,我的 ViewPart 与 MDB

public class View extends ViewPart {
    public static final String ID = "EclipseRCPStinkt.view";


    /**
     * This is a callback that will allow us to create the viewer and initialize
     * it.
     */
    public void createPartControl(Composite parent) {
        ManagedForm managed = new ManagedForm(parent);
        BlockZwei block = new BlockZwei();
        block.createContent(managed);
        managed.refresh();
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {

    }
}

我是不是忘记打电话了?我真的找不到我的错误

最佳答案

我遇到了同样的问题,并且没有太多关于如何在 Eclipse 中实现 MasterDetails 模式的在线资源。我来了,可惜还没人回答,所以我只能自己去调查一下。我主要尝试分析plugin.xml文件的eclipse编辑器的ExtensionsPage类。一般来说,我对 Eclipse 和 Java 很陌生,所以不要把我的答案当作神谕,但由于没有其他答案,它可能对你有一些用处。

使用调试器,您会注意到注册页面时会调用 initialize() 方法,因此它不依赖于您当前的选择。

我的 MasterDetailsBloc 类是这样的:

public class MyMasterDetailsBlock extends MasterDetailsBlock{

    private SectionPart fMasterSectionPart;
    private Section fMasterSection;
    private TreeViewer fTreeViewer;

    [...]

     /**
     * Create contents of the master details block.
     * @param managedForm
     * @param parent
     */
    @Override
    protected void createMasterPart(IManagedForm managedForm, Composite parent) {
        fMasterSection = managedForm.getToolkit().createSection(parent,
                   ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR);
        fMasterSectionPart = new SectionPart(fMasterSection, 0);

        Composite composite = new Composite(fMasterSection, SWT.RIGHT);
        fTreeViewer = new TreeViewer(composite, SWT.FILL);
        fTreeViewer.setContentProvider(new MyContentProvider());
        fTreeViewer.setLabelProvider(new MyLabelProvider());
        fTreeViewer.setInput(fMyInput);

        fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                detailsPart.selectionChanged(fMasterSectionPart,
                                             event.getSelection());
           }
       );

       [...]
}

     /**
     * Register the pages.
     * @param part
     */
    @Override
    protected void registerPages(DetailsPart part) {
        part.registerPage(MyClass.class, new MyClassDetailsPage());
    }
    [...]
}

诀窍似乎是您需要创建一个 SectionPart 来包装您的主 Section 小部件(在我的代码中,这些是 fMasterSectionPartfMasterSection分别在函数createMasterPart()中初始化)。然后,您需要向查看器添加一个 ISelectionChangedListener 对象,在其中调用 detailsPart.selectionChanged() ,瞧。注册页面很直观,但我注意到您必须单独注册每个类,即注册基类不适用于派生类。然而,这只是第一次观察,我还没有深入研究其机制。

这可能是丑陋且肮脏的解决方案,并且“你不应该这样做”。尽管如此,这是我能够使其发挥作用的唯一方法,并且网络上没有关于如何正确执行此操作的 Material 。希望我能帮上忙。

关于java - JFace MasterDetailsPart - 详细信息页面未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259952/

相关文章:

java - 使用 Tika 将元数据提取为 RDF

java - 为什么我用 Random Run 得到相同的数字?

c++ - 如何摆脱这个 Eclipse 警告?

java - 当 SWT 中 tabItem 列表发生更改时,TabItem 不会刷新

java - 等效的 SWTTreeNode API

java - 如何将 "driver"添加到 javax.comm? Java串口编程

java - 如何让jfreechart更快地显示tooltip点信息

java - 如何跳过一行代码的执行?

java - 将我的大部分代码放在另一个类中如何让它在 Eclipse 中运行?

eclipse-plugin - 如何选择为 TableViewer 行着色