0

の使用で直面している問題がありますorg.eclipse.ui.forms.widgets.Section。子を追加し、子を有効にするかテキストを設定して子を変更すると、例外が発生します。以下の問題を簡単に再現するために、小さなスニペットを作成しました。

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.widgets.Section;

public class SectionTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        final Display display = new Display ();
        final Shell shell = new Shell (display);
        shell.setLayout(new GridLayout());

        Button b = new Button(shell, SWT.PUSH);
        b.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addSection(shell);
            }
        });
        b.setText("Add");

        addSection(shell);

        shell.setSize(300, 300);
        shell.open();
        while (!shell.isDisposed()) {
            try {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            catch (Exception e) {
                e.printStackTrace();
                MessageDialog.openError(shell, "Error", e.getMessage());
            }
        }
        display.dispose();
    }

    private static void addSection(Composite parent) {
        Section section = new Section(parent, Section.TITLE_BAR | Section.TREE_NODE | Section.CLIENT_INDENT);
        section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        section.setText("Hello");
        //section.setSize(1, 1);

        // Add the check button for enabling/disabling this group
        Button enableControl = new Button(section, SWT.CHECK);
        enableControl.setText("Enable");
        section.setTextClient(enableControl);

        Composite client = new Composite(section, SWT.NONE);
        section.setClient(client);
        client.setLayout(new GridLayout());

        Button b = new Button(client, SWT.PUSH);
        b.setText("one");

        b = new Button(client, SWT.PUSH);
        b.setText("two");
        parent.layout();
    }
}

コードを実行すると、追加ボタンのあるダイアログが表示されます。追加ボタンをクリックすると、例外が発生します。

例外テキスト:

java.lang.IllegalArgumentException: Argument not valid
    at org.eclipse.swt.SWT.error(SWT.java:4342)
    at org.eclipse.swt.SWT.error(SWT.java:4276)
    at org.eclipse.swt.SWT.error(SWT.java:4247)
    at org.eclipse.swt.graphics.Image.init(Image.java:1558)
    at org.eclipse.swt.graphics.Image.<init>(Image.java:181)
    at org.eclipse.ui.forms.widgets.Section.onPaint(Section.java:344)
    at org.eclipse.ui.forms.widgets.ExpandableComposite$1.paintControl(ExpandableComposite.java:560)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:230)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
    at org.eclipse.swt.widgets.Composite.WM_PRINTCLIENT(Composite.java:1639)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4590)
    at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4976)
    at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
    at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2440)
    at org.eclipse.swt.widgets.Button.callWindowProc(Button.java:343)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4623)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4976)
    at org.eclipse.swt.internal.win32.OS.SetWindowTextW(Native Method)
    at org.eclipse.swt.internal.win32.OS.SetWindowText(OS.java:3461)
    at org.eclipse.swt.widgets.Button._setText(Button.java:300)
    at org.eclipse.swt.widgets.Button.setText(Button.java:1099)
    at org.eclipse.swt.snippets.SectionTest.addSection(SectionTest.java:58)
    at org.eclipse.swt.snippets.SectionTest.access$0(SectionTest.java:50)
    at org.eclipse.swt.snippets.SectionTest$1.widgetSelected(SectionTest.java:28)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
    at org.eclipse.swt.snippets.SectionTest.main(SectionTest.java:39)

この問題は、Windows 7 64ビットマシンの32ビットJRE(およびeclipse)で発生します。この同じ問題は、Windows XP(32ビット)では再現できません。

私の質問は、この例外の原因となる私が間違っていることです。シェルが開く前に同じメソッドを使用してセクションを追加すると、問題なく実行されますが、シェルが開いて表示されると、同じaddSection(Composite)メソッドを呼び出すと例外が発生します。

:行'section.setSize(1、1);'のコメントを解除します。inaddSection(Composite)は問題を「隠す」でしょうが、それは正しいことではないようです。セクションを使用する正しい方法は何ですか?


編集: ecilpse、https: //bugs.eclipse.org/bugs/show_bug.cgi?id = 309443ですでに報告されている問題が見つかりました。これは、この質問と同じ結果のようです。

4

0 に答える 0