高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1146
Illustrating document window changes in Swing


Q: 自分の Java アプリケーションにおいてドキュメントウィンドウが変更されたことを示したいと思っています。どのようにすれば、Carbon アプリケーションや Cocoa アプリケーションと同じように、ウィンドウの[閉じる]ボタンに表示されるドットを描画できますか?


Modified Document   Unchanged Document
図 1 新しいまたは未保存の変更を含むウィンドウの[閉じる]ボタンと含まないウィンドウの[閉じる]ボタン

A: Mac OS X で、Java 1.3.1 の Swing を利用し Aqua のルックアンドフィールを使っている場合は、 変更があったことを示すインジケータを[閉じる]ボタンに描画するピュア Java による方法があります。この方法とは、JComponent のすべてのサブクラスで利用できる putClientProperty() メソッドを使って設定できる単純な Swing クライアントプロパティです。このプロパティは windowModified であり、 プロパティ値を表す Booloean オブジェクトを使って設定する必要があります。これは、JInternalFrame、または JFrameJFrame は、AWT Frame クラスの拡張クラスで、clientProperty のサポートはありません)の rootPane に対して直接設定できます。リスト 1 は、テキストエディタにおけるこのプロパティの使用方法を示します。



import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class Editor extends JFrame
  implements DocumentListener, ActionListener {

    final static String WINDOW_MODIFIED = "windowModified";

    JEditorPane jp;
    JMenuBar jmb;
    JMenu file;
    JMenuItem save;

    public Editor(String title) {
        super(title);
        jp = new JEditorPane();
        jp.getDocument().addDocumentListener(this);
        getContentPane().add(jp);
        jmb = new JMenuBar();
        file = new JMenu("File");
        save = new JMenuItem("Save");
        save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
          java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        save.addActionListener(this);
        file.add(save);
        jmb.add(file);
        setJMenuBar(jmb);
        setSize(400,600);
        setVisible(true);
    }

    // doChange() と actionPerformed() で、windowModified の状態を扱う
    public void doChange() {
        getRootPane().putClientProperty(WINDOW_MODIFIED, Boolean.TRUE);
    }

    public void actionPerformed(ActionEvent e) {
        // ここで保存機能を記述する
        getRootPane().putClientProperty(WINDOW_MODIFIED, Boolean.FALSE);
    }

    // DocumentListener の実装
    public void changedUpdate(DocumentEvent e) { doChange(); }
    public void insertUpdate(DocumentEvent e)  { doChange(); }
    public void removeUpdate(DocumentEvent e)  { doChange(); }

    public static void main(String[] args) {
        new Editor("test");
    }
}

リスト 1 windowModified の状態を含めたテキストエディタ




[2002 年 6 月 18 日]