2014-08-10

SWT による GUI プログラミング (3)

SWT, Standard Widget Toolkit を利用した基本的なサンプルを紹介します。今回は Menu, Toolbar クラスのウィジェットです。

Menu

Menu および関連クラスのインスタンスはプルダウンメニューのメニューバーです。

List: SWTAppMenu.java
package menu;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

public class SWTAppMenu {
    Shell shell;

    public SWTAppMenu(Display display) {
        shell = new Shell(display);
        shell.setText("Menu");

        initUI();

        shell.setSize(300, 200);
        shell.setLocation(100, 100);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    public void initUI() {
        Menu menuBar = new Menu(shell, SWT.BAR);
        shell.setMenuBar(menuBar);

        MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
        cascadeFileMenu.setText("ファイル");
        Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
        cascadeFileMenu.setMenu(fileMenu);

        MenuItem newItem = new MenuItem(fileMenu, SWT.PUSH);
        newItem.setText("新規ファイル");

        MenuItem openItem = new MenuItem(fileMenu, SWT.PUSH);
        openItem.setText("ファイルを開く");
        openItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                String[] filters = new String[] { "Java sources",
                        "All Files (*)" };
                String[] extensions = new String[] { "*.java", "*" };

                FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                dialog.setFilterNames(filters);
                dialog.setFilterExtensions(extensions);

                String path = dialog.open();
                if (path != null) {
                    System.out.println(path + "が選択されました。");
                }
            }
        });

        new MenuItem(fileMenu, SWT.SEPARATOR);
        
        MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
        exitItem.setText("アプリケーションの終了");
        exitItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                shell.getDisplay().dispose();
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        Display display = new Display();
        new SWTAppMenu(display);
        display.dispose();
    }
}

実行例

Toolbar

Toolbar および関連クラスのインスタンスはプルダウンメニューの代わりにアイコンイメージなどのボタンでコマンドメニュー群を構成する場合に利用します。

List: SWTAppToolbar.java
package toolbar;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

public class SWTAppToolbar {
    private Shell shell;
    private Image newImage;
    private Image openImage;
    private Image exitImage;

    public SWTAppToolbar(Display display) {
        shell = new Shell(display);
        shell.setText("Toolbar");

        initUI();

        shell.setSize(300, 200);
        shell.setLocation(100, 100);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    public void initUI() {
        Device dev = shell.getDisplay();
        try {
            newImage = new Image(dev, "image/document-new.png");
            openImage = new Image(dev, "image/document-open.png");
            exitImage = new Image(dev, "image/application-exit.png");
        } catch (Exception e) {
            System.out.println("Cannot load images");
            System.out.println(e.getMessage());
            System.exit(1);
        }

        ToolBar toolBar = new ToolBar(shell, SWT.BORDER);

        ToolItem newItem = new ToolItem(toolBar, SWT.PUSH);
        newItem.setImage(newImage);
        newItem.setToolTipText("新規ファイル");

        ToolItem openItem = new ToolItem(toolBar, SWT.PUSH);
        openItem.setImage(openImage);
        openItem.setToolTipText("ファイルを開く");
        openItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                String[] filters = new String[] { "Java sources",
                        "All Files (*)" };
                String[] extensions = new String[] { "*.java", "*" };

                FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                dialog.setFilterNames(filters);
                dialog.setFilterExtensions(extensions);

                String path = dialog.open();
                if (path != null) {
                    System.out.println(path + "が選択されました。");
                }
            }
        });

        new ToolItem(toolBar, SWT.SEPARATOR);

        ToolItem exitItem = new ToolItem(toolBar, SWT.PUSH);
        exitItem.setImage(exitImage);
        exitItem.setToolTipText("アプリケーションの終了");
        exitItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                shell.getDisplay().dispose();
                System.exit(0);
            }
        });
        toolBar.pack();
    }

    public static void main(String[] args) {
        Display display = new Display();
        new SWTAppToolbar(display);
        display.dispose();
    }
}

このサンプルでは、終了時にイメージの廃棄処理をしていませんので、メモリに残ってしまいます。ImageRegistry を利用した例を、JFace のサンプルで説明する予定です。

実行例

参考サイト

  1. Help - Eclipse Platform
  2. Java SWT tutorial
  3. FrontPage - SWTサンプル集

0 件のコメント: