メモの日々


2013年10月02日(水) [長年日記]

[java] javax.swing.JRadioButtonの状態変化を監視する

JRadioButtonが選択された時と選択を解除された時に通知を受ける方法がなかなかわからなかったのでメモ。

ActionListenerはボタンが選択された時にだけ呼ばれるので目的の用途に合わない。

ItemListenerというものがあって、これがラジオボタンの状態変化に応じて通知を受け取れる。


2013年10月03日(木) [長年日記]

[java] java.swing.JTextAreaの文字数を制限する

JTextAreaに入力できる文字数を制限したいが簡単にはできないみたい。文字数を制限するDocumentFilterを作ったらうまくいったようなのでメモ。

(追記)

あー、制限を超えて日本語を入れようとすると変な動作になってしまう。文字変換のときにDocumentから文字が削除されてしまうからみたいだけど、よくわからない。

(追記2)

コメントで対処方法を教えていただいたので、AttributeSetの内容をチェックするように変更してみました。これで漢字変換を行った場合でも問題なく動くようになったようです。

なお、「文字変換のときにDocumentから文字が削除されてしまう」という処理は、JTextComponent#replaceInputMethodText()内で行われているようでした。

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
import javax.swing.text.StyleConstants;

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

    static void build() {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(createTextArea()), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setVisible(true);
    }

    static JTextArea createTextArea() {
        PlainDocument document = new PlainDocument();
        document.setDocumentFilter(new LengthLimitter(10));
        JTextArea textArea = new JTextArea(document);
        return textArea;
    }

    static class LengthLimitter extends DocumentFilter {
        private final int limit;

        public LengthLimitter(int limit) {
            this.limit = limit;
        }

        @Override
        public void insertString(
                FilterBypass fb,
                int offset,
                String string,
                AttributeSet attr) throws BadLocationException {
            super.insertString(
                fb, offset, filterText(fb, string, limit, attr), attr);
        }

        @Override
        public void replace(
                FilterBypass fb,
                int offset,
                int length,
                String text,
                AttributeSet attrs) throws BadLocationException {
            super.replace(
                fb,
                offset,
                length,
                filterText(fb, text, limit + length, attrs),
                attrs);
        }

        static String filterText(
                FilterBypass fb, String text, int limit, AttributeSet attrs) {
            if (text == null) return text;
            if (attrs != null
                    && attrs.isDefined(StyleConstants.ComposedTextAttribute)) {
                return text;
            }

            int rest = limit - fb.getDocument().getLength();
            if (rest <= 0) return "";
            if (text.length() > rest) text = text.substring(0, rest);
            return text;
        }
    }
}
本日のツッコミ(全2件) [ツッコミを入れる]

java勉強中 [参考にさせていただきました。ありがとうございます。 日本語変換確定前はinsertStringでfilterText..]

小川 [なるほど、AttributeSetをチェックする必要があるのですね。StyleConstants.ComposedT..]


2013年10月18日(金) [長年日記]

[java] java.util.Listを拡張する

C++のstd::vector#resize()のようにJavaのListのサイズを拡大したかったのだけれど、Listにはresize()メソッドは無い。

Collectionsのドキュメントを眺めていたらCollections#nCopies()の説明に

このメソッドは、List.addAll メソッドとともにリストを拡張するために使われます。

とあったので、このメソッドを使うのがいいみたい。意外と難しかったのでメモ。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ListResize {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
        list.addAll(Collections.<Integer>nCopies(5, null));
        System.out.println(list);
    }
}
[1, 2, 3, null, null, null, null, null]

2013年10月24日(木) [長年日記]

[life][hard] PCが壊れた

木曜日の夜に自宅のPCが起動しなくなってしまった。

電源を入れると5秒後くらいに勝手に電源オフになり、その5秒後くらいに自動的に電源オンになるがそのまま何も起こらずモニタにも何も映らない、といった状態。DVDドライブの開け閉めだけはできるが、CPUファンも回らずマザーボードが動作しなくなってしまった模様。

このPCを買ったのは5年前。金曜日にマザーボードのボタン電池を交換してみたが効果なし。8月の落雷が原因で壊れたのかなあ。困った。

[life][hard][windows] PCを買った

PCが無いと何もできなくて困るので、金曜日に急遽注文。再びエプソンダイレクトで。HPなどの他のメーカーの方が安く買えそうだったが、届くのが早い所で買った。が、週末を挟んでしまったので届いたのは火曜日の午前中。

買ったのはEndeavor MR4300Eという、前回のものの後継機種のデスクトップPC。

前回同様構成をメモ。

OS
Windows 8ではなく、Windows 7 Professional 64bitにした。Windows 8だとXPモードが使えないようで、会計ソフトなどの古いソフトが動かなかった場合に困るので。
CPU
Core i5 4440にした。Haswell世代。
メモリ
8GBにした。
HDD
最小構成の500GBにした。前回の250GBで足りていたので。SSDにはしない。
光ディスクドライブ
DVD書き込みができるスーパーマルチドライブにした。前回は書き込みができないROMドライブにしていて困ることもなかったんだけど、数千円の違いなら書き込みができた方がいいかなと考えた。

これで税・送料込み104,265円。前回より2万円安い。Windowsエクスペリエンスインデックスは5.9と表示されている。

で、壊れたPCからHDDを抜き取って新しいPCに繋いでみたところ、無事データを参照することができた。よかったよかった。


2013年10月26日(土) [長年日記]

[soft][windows][work] やよいの青色申告 05はWindows 7でも動いた

2005年に買ったやよいの青色申告05というソフトを今でも使っている。このソフトがWindows 7上でも動作するのか気になっていたのだけれど、弥生の説明では「動作対応対象外」となっていた。

が、一応インストールしてみたところ、普通に動いているように見える。もっとも、細かいところまで正しく動作しているのかは確認できないけれど。今年はこのソフトで乗り切ろうと思う。

来年からは新しいソフトを使う必要があるだろう。やよいの青色申告の最新版を買えばいいのだが、結構お高いなあ。
-
-
-

[soft][windows] DatulaもWindows 7上で動いた

訳あってたまにDatulaを起動することがある。このソフトもWindows 7上で動いた。

継続して使うには利用者登録が必要で、そのためにはregファイルを実行する必要があるのだけれど、その実行はエラーになってしまいうまくいかなかった。が、regファイルはテキストファイルで、そこにあったユーザ名とpasscodeをDatulaの利用者名の登録ダイアログから入力したらちゃんと登録された。