PR

今週も引き続き次世代Java Plug-inのJNLPサポートについて解説していきます。今週取りあげるのはクリップボードへのアクセスです。

Swingでのコピー&ペーストは,Java SE 6完全攻略第29回で取りあげたjavax.swing.TransferHandlerクラスを使用します。とはいうものの,JTextAreaクラスなどは,TansferHandlerクラスの存在を意識することなくコピー&ペーストを行うことができます。

では,Java SE 6u10の新機能その11で作成した簡易エディターにコピー&ペーストの機能を付加してみましょう。

サンプルのソース (こちらからダウンロードできます)
・SimpleEditor.java
・simpleeditor.jnlp

ここでは,メニューバーに新たに[Edit]メニューを作成し,[Cut],[Copy],[Paste]の三つの項目を付け加えました。

public class SimpleEditor extends JApplet {
    private FileOpenService openService;
    private FileSaveService saveService;
    private JTextArea textArea;
    private FileContents contents;

    @Override
    public void init() {
        ((JComponent)getContentPane()).setBorder(
                                new EmptyBorder(10, 10, 10, 10));

        try {
            // サービスの取得
            openService = (FileOpenService)ServiceManager.lookup(
                                    "javax.jnlp.FileOpenService");
            saveService = (FileSaveService)ServiceManager.lookup(
                                    "javax.jnlp.FileSaveService");

            initMenuBar();

            textArea = new JTextArea();
            add(new JScrollPane(textArea));
        } catch (UnavailableServiceException ex) {
            // サービスが使用できない場合
            JLabel label = new JLabel("サービスが使えません");
            add(label);
        }
    }

    private void initMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        initFileMenu(menuBar);
        initEditMenu(menuBar);
    }

    private void initFileMenu(JMenuBar menuBar) {
        JMenu menu = new JMenu("File");
        menuBar.add(menu);

        JMenuItem openItem = new JMenuItem("Open...");
        openItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                openFile();
            }
        });
        menu.add(openItem);

        JMenuItem saveItem = new JMenuItem("Save");
        saveItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                saveFile();
            }
        });
        menu.add(saveItem);

        JMenuItem saveAsItem = new JMenuItem("Save As...");
        saveAsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                saveAsFile();
            }
        });
        menu.add(saveAsItem);
    }
 
    private void initEditMenu(JMenuBar menuBar) {
        JMenu menu = new JMenu("Edit");
        menuBar.add(menu);
 
        // カット
        JMenuItem cutItem = new JMenuItem("Cut");
        cutItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                textArea.cut();
            }
        });
        menu.add(cutItem);
 
        // コピー
        JMenuItem copyItem = new JMenuItem("Copy");
        copyItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                textArea.copy();
            }
        });
        menu.add(copyItem);
 
        // ペースト
        JMenuItem pasteItem = new JMenuItem("Paste");
        pasteItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                textArea.paste();
            }
        });
        menu.add(pasteItem);
    }

    <<以下,省略>>

赤字の部分がコピー&ペーストを実行する部分です。JTextAreaクラスにはカット,コピー,ペーストを行うメソッドが提供されているので,それをコールしているだけです。