2

ボタンを追加するためのカスタムJFaceウィザードダイアログを作成しました。レイアウト内の位置を変更する方法(キャンセルボタンと終了ボタンの間に配置するなど)を見つけましたが、[前へ]ボタンと[次へ]ボタンの間に配置しようとすると機能しません。

コードは次のとおりです。

@Override
protected void createButtonsForButtonBar(Composite parent) {
    super.createButtonsForButtonBar(parent);

    Button nextButton = getButton(IDialogConstants.NEXT_ID);
    nextButton.setText(NEXT_LABEL);
    Button backButton = getButton(IDialogConstants.BACK_ID);
    backButton.setText(BACK_LABEL);
    Button cancelButton = getButton(IDialogConstants.CANCEL_ID);
    cancelButton.setText(CANCEL_LABEL);
    Button finishButton = getButton(IDialogConstants.FINISH_ID);
    finishButton.setText(FINISH_LABEL);

    rejectButton = super.createButton(parent, REJECT_ID, REJECT_LABEL, false);
    rejectButton.moveAbove(nextButton);
    setButtonLayoutData(rejectButton);

    acceptButton = super.createButton(parent, ACCEPT_ID, ACCEPT_LABEL, false);
    acceptButton.moveBelow(rejectButton);
    setButtonLayoutData(acceptButton);

}

ウィザードを見ると、[前へ]ボタンと[次へ]ボタンの間のスペースが他のボタンよりも薄いことがわかります。それらが一緒にバインドされているように見えるか、そのようなもの...

彼らの立場を変える別の解決策はありますか?

ありがとうございました :)

4

1 に答える 1

3

結局のところ、解決策は非常に簡単でした=)

[戻る]ボタンと[次へ]ボタンには、メインコンポジット内に独自の親コンポジットがあります。

private Composite createPreviousAndNextButtons(Composite parent) {
    // increment the number of columns in the button bar
    ((GridLayout) parent.getLayout()).numColumns++;
    Composite composite = new Composite(parent, SWT.NONE);
    // create a layout with spacing and margins appropriate for the font
    // size.
    GridLayout layout = new GridLayout();
    layout.numColumns = 0; // will be incremented by createButton
    layout.marginWidth = 0;
    layout.marginHeight = 0;
    layout.horizontalSpacing = 0;
    layout.verticalSpacing = 0;
    composite.setLayout(layout);
    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_CENTER
            | GridData.VERTICAL_ALIGN_CENTER);
    composite.setLayoutData(data);
    composite.setFont(parent.getFont());
    backButton = createButton(composite, IDialogConstants.BACK_ID,
            IDialogConstants.BACK_LABEL, false);
    nextButton = createButton(composite, IDialogConstants.NEXT_ID,
            IDialogConstants.NEXT_LABEL, false);
    return composite;

そこで、オーバーライドしたメソッドのコードを次のように変更しました。

@Override
protected void createButtonsForButtonBar(Composite parent) {
    super.createButtonsForButtonBar(parent);

    Button cancelButton = getButton(IDialogConstants.CANCEL_ID);
    cancelButton.setText(CANCEL_LABEL);
    Button finishButton = getButton(IDialogConstants.FINISH_ID);
    finishButton.setText(FINISH_LABEL);

    rejectButton = super.createButton(parent, REJECT_ID, REJECT_LABEL, false);
    setButtonLayoutData(rejectButton);

    acceptButton = super.createButton(parent, ACCEPT_ID, ACCEPT_LABEL, false);
    acceptButton.moveBelow(rejectButton);
    setButtonLayoutData(acceptButton);

    if (super.getWizard().needsPreviousAndNextButtons()) {
        Button nextButton = getButton(IDialogConstants.NEXT_ID);
        nextButton.setText(NEXT_LABEL);
        Button backButton = getButton(IDialogConstants.BACK_ID);
        backButton.setText(BACK_LABEL);

        // change composite parent of back and next buttons.
        nextButton.setParent(parent);
        backButton.setParent(parent);
        ((GridLayout) parent.getLayout()).numColumns = ((GridLayout) parent.getLayout()).numColumns + 2;

        // defines buttons'order
        finishButton.moveBelow(null);
        cancelButton.moveAbove(finishButton);
        nextButton.moveAbove(cancelButton);
        acceptButton.moveAbove(nextButton);
        rejectButton.moveAbove(acceptButton);
        backButton.moveAbove(rejectButton);
    }   
}

=)

于 2012-08-08T09:32:07.393 に答える