2013-06-23 43 views
2

我第一次使用JFace MasterDetailsPart時遇到了一些麻煩。詳細信息頁面未顯示 - 當我選擇一個新項目時,該事件未被觸發。 我找不到任何好的示例或教程,甚至JavaDoc也無法幫助我。JFace MasterDetailsPart - 細節頁面未顯示

的detailspart只是實現IDetailsPart和SYSOUT的,當它被初始化消息(其被示出),但標籤未顯示:這裏是DetailsPart碼:

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()); 


    } 

正如你所看到的,我註冊了一個監聽器的選擇,而據我瞭解事件應該觸發對detailspage一個事件。 最後但並非最不重要的,我與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() { 

    } 
} 

ViewPart時難道我忘了叫什麼?我真的找不到我的錯誤

回答

2

我有同樣的問題,並沒有太多關於如何在eclipse中實現MasterDetails模式的在線資源。我來到這裏,但不幸的是沒有人回答,所以我必須自己調查。我主要試圖分析plugin.xml文件的eclipse編輯器的ExtensionsPage類。我對Eclipse和Java一般都很新鮮,所以不要把我的答案當作oracle,但是因爲沒有其他答案,它可能對你有一些用處。

使用調試器,您會注意到在註冊頁面時會調用方法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分別這些都是fMasterSectionPartfMasterSection包裝你的主人Section插件(在我的代碼,在初始化功能createMasterPart())。然後,您需要爲您的查看器添加一個ISelectionChangedListener對象,並在其中調用detailsPart.selectionChanged()和voila。註冊頁面直觀,但我注意到,你必須單獨註冊每個類,即註冊基類不適用於派生類。但這只是第一次觀察,我還沒有深入研究這一機制。

它可能發生這是醜陋和骯髒的解決方案,「你不應該這樣做」。儘管如此,這是我能夠實現這一目標的唯一方式,網絡上沒有關於如何正確使用的材料。我希望我能幫忙。