0

私は SWT を初めて使用し、現在Labelインスタンスを表示するのに苦労しています。現時点では、ウィンドウを表示するには手動でサイズを変更する必要があります。SWTのキャッシュについて言及しているSOに関する同様の質問を見つけました。だから私は提案された呼び出しを試みましたが、私にはうまくいきshell.layout();ません。これが私のコードです:

public class SimpleTextEditorCount {
private Display display = new Display();
private Shell shell = new Shell(this.display);
private StyledText styledText;
private boolean unsaved;
private File file;
private String lastDirectory;
private Label status;

public SimpleTextEditorCount() {
    this.shell.setLayout(new GridLayout());
    this.createMenuBar();
    this.styledText = new StyledText(this.shell, SWT.MULTI | SWT.WRAP
            | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    this.styledText.setLayoutData(new GridData(GridData.FILL_BOTH));
    final Font font = new Font(this.shell.getDisplay(), "Book Antiqua", 12,
            SWT.NORMAL);
    this.styledText.setFont(font);
    this.styledText.addModifyListener(new ModifyListener() {
        @Override
        public void modifyText(ModifyEvent e) {
            unsaved = true;
        }
    });
    this.shell.setText("Editor");
    this.shell.setSize(400, 300);
    this.createCount();
    this.shell.open();
    while (!this.shell.isDisposed()) {
        if (!this.display.readAndDispatch()) {
            this.display.sleep();
        }
    }
    this.display.dispose();
}

private void createMenuBar() { 
    // Create the File top-level menu
    Menu menu = new Menu(this.shell, SWT.BAR);      
    MenuItem open = new MenuItem(menu, SWT.CASCADE);
    open.setText("File");

    Menu dropMenu = new Menu(this.shell, SWT.DROP_DOWN);
    open.setMenu(dropMenu); 

    // File->Open
    open = new MenuItem(dropMenu, SWT.NULL);
    open.setText("Open...\tCtrl+O");
    open.setAccelerator(SWT.CTRL + 'O');
    open.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            loadText();
        }
    });

    // File->Save
    MenuItem save = new MenuItem(dropMenu, SWT.NULL);
    save.setText("Save\tCtrl+S");
    save.setAccelerator(SWT.CTRL + 'S');
    save.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            saveText();
        }
    });

    // File->Save As
    MenuItem saveAs = new MenuItem(dropMenu, SWT.NULL);
    saveAs.setText("Save As...");
    saveAs.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            System.err.println("NEEDS TO BE IMPLEMENTED");
        }
    });

    // File->Exit
    MenuItem exit = new MenuItem(dropMenu, SWT.SEPARATOR); 
    exit = new MenuItem(dropMenu, SWT.NULL);
    exit.setText("Exit\tAlt+F4");
    exit.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            if (saveChanges()) {
                shell.dispose();
            }
        }
    });

    // Create Edit
    MenuItem edit = new MenuItem(menu, SWT.CASCADE);
    edit.setText("Edit");
    dropMenu = new Menu(shell, SWT.DROP_DOWN);
    edit.setMenu(dropMenu); // Create Edit->Cut
    edit = new MenuItem(dropMenu, SWT.NULL);
    edit.setText("Cut\tCtrl+X");
    edit.setAccelerator(SWT.CTRL + 'X');
    edit.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            styledText.cut();
        }
    });

    // Create Edit->Copy
    MenuItem copy = new MenuItem(dropMenu, SWT.NULL);
    copy.setText("Copy\tCtrl+C");
    copy.setAccelerator(SWT.CTRL + 'C');
    copy.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            styledText.copy();
        }
    });

    // Create Edit->Paste
    MenuItem paste = new MenuItem(dropMenu, SWT.NULL);
    paste.setText("Paste\tCtrl+V");
    paste.setAccelerator(SWT.CTRL + 'V');
    paste.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            styledText.paste();
        }
    });

    // Create Select All
    MenuItem selectAll = new MenuItem(dropMenu, SWT.SEPARATOR); 
    selectAll = new MenuItem(dropMenu, SWT.NULL);
    selectAll.setText("Select All\tCtrl+A");
    selectAll.setAccelerator(SWT.CTRL + 'A');
    selectAll.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            System.err.println("NEEDS TO BE IMPLEMENTED");
        }
    });

    MenuItem undo = new MenuItem(dropMenu, SWT.SEPARATOR); // Create Undo
    undo = new MenuItem(dropMenu, SWT.NULL);
    undo.setText("Undo\tCtrl+Z");
    undo.setAccelerator(SWT.CTRL + 'Z');
    undo.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            System.err.println("NEEDS TO BE IMPLEMENTED");
        }
    });

    // Create Help
    MenuItem help = new MenuItem(menu, SWT.CASCADE);
    help.setText("Help");
    dropMenu = new Menu(shell, SWT.DROP_DOWN);
    help.setMenu(dropMenu); // Create Help->About
    help = new MenuItem(dropMenu, SWT.NULL);
    help.setText("About");
    help.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent event) {
            System.err.println("NEEDS TO BE IMPLEMENTED");
        }
    });
    this.shell.setMenuBar(menu);
}

public void createCount() {
    this.status = new Label(this.shell, SWT.BORDER);
    this.status.setText("test");
    this.status.setLayoutData(new GridData(GridData.FILL,
            GridData.BEGINNING, true, false, 2, 1));
    this.shell.layout();
    styledText.addModifyListener(new ModifyListener() {
        @Override
        public void modifyText(ModifyEvent arg0) {
            updateStatus();
        }
    });
    styledText.addKeyListener(new KeyListener() {
        @Override
        public void keyReleased(KeyEvent arg0) {
        }

        @Override
        public void keyPressed(KeyEvent arg0) {
            updateStatus();
        }
    });
}

private void updateStatus() {
    StringBuffer buf = new StringBuffer();
    buf.append("Offset: ");
    buf.append(this.styledText.getCaretOffset());
    buf.append("\tChars: ");
    buf.append(this.styledText.getCharCount());
    buf.append("\tLine: ");
    buf.append(this.styledText.getLineAtOffset(this.styledText
            .getCaretOffset()) + 1);
    buf.append(" of ");
    buf.append(this.styledText.getLineCount());
    this.status.setText(buf.toString());
}

boolean saveChanges() {
    if (!this.unsaved) {
        return true;
    }
    final MessageBox box = new MessageBox(this.shell, SWT.ICON_WARNING
            | SWT.YES | SWT.NO | SWT.CANCEL);
    box.setMessage("save changes? ");
    box.setText("Editor");
    final int condition = box.open();
    if (condition == SWT.YES) {
        return this.saveText();
    } else if (condition == SWT.NO) {
        return true;
    } else {
        return false;
    }
}

boolean loadText() {
    final FileDialog dialog = new FileDialog(this.shell, SWT.OPEN);
    if (this.lastDirectory != null) {
        dialog.setFilterPath(this.lastDirectory);
    }
    final String selectedFile = dialog.open();
    if (selectedFile == null) {
        System.out.println("File is not opened");
        return false;
    }
    this.file = new File(selectedFile);
    this.lastDirectory = this.file.getParent();

    try {
        final BufferedReader reader = new BufferedReader(new FileReader(
                this.file));
        final StringBuffer buffer = new StringBuffer();
        String line = null;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
            buffer.append("\r\n");
        }
        this.styledText.setText(buffer.toString());
        return true;
    } catch (final IOException e) {
    }
    return false;
}

boolean saveText() {
    if (this.file == null) {
        final FileDialog fileDialog = new FileDialog(this.shell, SWT.SAVE);
        if (this.lastDirectory != null) {
            fileDialog.setFilterPath(this.lastDirectory);
        }
        final String selectedFile = fileDialog.open();
        if (selectedFile == null) {
            System.out.println("File is not saved");
            return false;
        }
        this.file = new File(selectedFile);
        this.lastDirectory = this.file.getParent();
    }
    try {
        final FileWriter writer = new FileWriter(this.file);
        writer.write(this.styledText.getText());
        writer.close();
        this.unsaved = false;
        return true;
    } catch (final IOException e) {
    }
    return false;
}

public static void main(String[] args) {
    new SimpleTextEditorCount();
}

}

何か提案はありますか?ありがとうございました!

編集:コード スニペットをファイル全体に置き換えました。この奇妙な動作は、メニュー バーによって引き起こされているように思われます。this.createMenuBar();コンストラクターで作成をコメントアウトすると、ラベルが適切に視覚化されます (createCount()メソッドによって作成されます)。

編集:正しい解決策を見つけることができませんでした。pack()そのため、サイズ変更を強制するために、ウィンドウが開かれた後に呼び出しを追加しました。コンストラクターに加えた変更は次のとおりです。

//... code 
this.shell.setSize(400, 300);
this.shell.open();
this.shell.pack();
this.shell.setSize(400, 300);
while (!this.shell.isDisposed()) {
    if (!this.display.readAndDispatch()) {
        this.display.sleep();
    }
}
// ... further code

追加されたパックとサイズ変更の呼び出しなしでスクリーンショットを作成しました。ラベルは表示されません。

そして、次の 2 行を追加します。

ここに画像の説明を入力

ありがとうございました!

4

1 に答える 1

0

これは必ずしもキャッシュに関連しているとは思いません。以下を確認してください。

  1. シェルで正しいレイアウトマネージャーを設定する
  2. ウィジェットに間違った GridData を設定しています。
  3. あなたはあまり具体的ではありません。レイアウトを構築し、シェルを開いてラベルが表示されないと仮定すると、設定したウィンドウ サイズが小さすぎる可能性があります。たぶん、単純な呼び出しでshell.pack()問題が解決しますか?
于 2012-05-26T19:14:28.337 に答える