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;
}
}
}
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に繋いでみたところ、無事データを参照することができた。よかったよかった。

● java勉強中 [参考にさせていただきました。ありがとうございます。 日本語変換確定前はinsertStringでfilterText..]
● 小川 [なるほど、AttributeSetをチェックする必要があるのですね。StyleConstants.ComposedT..]