2

初めて JFace MasterDetailsPart を使用する際に問題が発生しました。詳細ページが表示されず、新しいアイテムを選択してもイベントが発生しません。これに関する良い例やチュートリアルは見つかりませんでした。JavaDoc でさえ役に立ちませんでした。

detailspart は、初期化時に IDetailsPart と SYSOUT のメッセージを実装するだけですが (表示されています)、Label は表示されません: 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());


    }

ご覧のとおり、リスナーをセレクションに登録します。私が理解している限り、イベントは詳細ページでイベントをトリガーする必要があります。最後になりましたが、MDB を使用した ViewPart

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

    }
}

私は何かを呼び出すのを忘れましたか?私は本当に自分の間違いを見つけることができませんでした

4

1 に答える 1

2

私は同じ問題を抱えていましたが、Eclipse で MasterDetails パターンを実装する方法に関するオンライン リソースはあまりありません。私はここに来ましたが、残念ながらまだ誰も答えていないので、自分で調べなければなりませんでした. 主にファイルExtensionsPageのEclipseエディターのクラスを分析してみました。plugin.xml私は一般的に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をラップするを作成する必要があるようです(私のコードでは、これらはそれぞれ関数で初期化されています)。次に、ビューアーにオブジェクトを追加する必要があります。ここで呼び出して出来上がりです。ページの登録は直感的に行えますが、各クラスを個別に登録する必要があることに気付きました。つまり、基本クラスの登録は派生クラスには機能しません。ただし、これは最初の観察であり、メカニズムについてはまだ深く調査していません。SectionfMasterSectionPartfMasterSectioncreateMasterPart()ISelectionChangedListenerdetailsPart.selectionChanged()

これは醜くて汚い解決策であり、「このようにすべきではない」ということが起こるかもしれません。それにもかかわらず、これが私がそれを機能させる唯一の方法であり、それを正しく行う方法についてのウェブ上の資料はありません. お役に立てれば幸いです。

于 2013-07-06T13:33:39.003 に答える