inamenaiの日記 RSSフィード

2010年10月22日

私的Swingメモ

  • JFrameを継承したクラスを作成しそこにmainメソッドを定義する。主な初期処理はこのクラスのコンストラクタで行う。
public class BaseFrame extends JFrame {
    public static void main(String[] args) {
        BaseFrame base = new BaseFrame();
        base.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        base.setVisible(true);
    }
    public BaseFrame() {
        // コンポーネントの作成・配置など。
    }
}
  • JFrame.setDefaultCloseOperation() メソッドで「閉じる」を押したときの挙動を設定する。何もしてない状態だと「閉じる」を押してもウィンドウは閉じるがアプリケーションは終了しない(デフォルトは JFrame.EXIT_ON_CLOSE が良かったんじゃないだろうか…)。
  • JFrame.setVisible() は実行するタイミングによって挙動が変わる場合がある…気がする(単に可視状態になるタイミングの問題だけでなくコンポーネントの配置が崩れたりする)。main()の最後に実行するのが安全そう。
  • JEditorPaneをHTML形式で使うとデフォルトの行間がなぜかとても広くなっていて、line-heihtスタイルでの調整も効かないために使いづらい…(何か対応策はあるのかな?)
    (2010/11/05追記:少なくともWindowsの場合は下記の方法で通常のフォントや行間にできることを確認。)
try {
    // WindowsのLook&Feelを使用
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
JEditorPane editorPane = new JEditorPane();
editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
  • JLabelは1つのラベルにテキストと画像を同時に設定できたり、HTMLも使える何かと便利な子。
  • (Swingに限った話ではないが)イベント処理でaddXXXListenerするときは無名クラスを使って実装するのが便利。またXXXListenerに定義されている全てのメソッドを実装する必要がないときはXXXXAdapterを継承させるとよい。
hoge.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // ここに処理を記述
    }
});

hoge.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        // ここに処理を記述
    }
    // keyReleased()とkeyTyped()はいらない。
});

  • JList(など)はデータとその表示を分離しつつ連動させることができる。表示をカスタマイズしたい場合は、ListCellRendererを実装したクラスを用意し、ListModelにそのインスタンスを追加していく。
// JLabelを表示させたい場合
public class CustomJLabel extends JLabel implements ListCellRenderer {
    @Override
    public Component getListCellRendererComponent(
            JList list, Object obj, int index, boolean isSelected, boolean hasFocus) {
        // thisに対して表示内容を設定
        return this;
    }
}

何かあれば適宜追加していく。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/inamenai/20101022/p1