メモの日々


2013年09月27日(金) [長年日記]

[java] Javaでシステムの改行コードを取得

以前は System.getProperty("line.separator") で取得していたがJava 7ではSystem.lineSeparator()が使える、ということが検索してもあまり出てこないのでメモ。

[java] JOptionPaneが作るダイアログをESC押下で閉じないようにする

JOptionPaneで作ったダイアログは、ESCキーを押下すると閉じてしまう。この挙動はVIM使いにとってはイラつくケースがある。

JOptionPane optionPane = new JOptionPane();
optionPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
        KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "none");

のようにJOptionPaneのインスタンスのWHEN_IN_FOCUSED_WINDOWに対応するInputMapのESCキー押下に対する要素を上書きしたら、ESCキーを押しても閉じないダイアログを生成できた。

でもこうするのはあまりよくない気がしてきた。閉じる前に確認ダイアログを表示する方がいいか。

[java] JDialogのwindowClosedイベントが複数回来る

JDialogに対してwindowClosedイベントが何回も来るんだけどなんで?困る。Javaのバージョンは1.7.0_25。

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DialogTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                test();
            }
        });
    }

    public static void test() {
        JDialog dialog = new JDialog((JFrame)null, true);
        dialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("closing");
            }
            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("closed");
            }
        });
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
        dialog.dispose();
    }
}
closing
closed
closed