- PR -

TableCellRendererでJFormattedTextField

1
投稿者投稿内容
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2004-05-13 11:24
 こんにちは。
 swing初心者です、すみません以下について何かご経験があれば
教えてください。

 現在JTableの表示で(まだCellEditorまでたどり着いていません)
金額表示(右寄せのカンマ区切り)を表示したいのですが、セルに対
してJFormattedTextFieldを使用して表示する事はできないでしょう
か?どなたか実現したご経験がありましたら参考になるサイトでも結
構ですので教えて頂けないでしょうか。

 一応rendererは以下のようにしてTableColumnクラスにセットして
います。
class DataRenderer
extends JFormattedTextField
implements TableCellRenderer {
public DataRenderer(AbstractFormatterFactory arg0) {
super(arg0);
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setText((String) value);
return (this);
}
}
 コンストラクタにはDecimalFormatを渡しています
new DefaultFormatterFactory(new NumberFormatter(
new DecimalFormat("###,###,###,###,###,##0")));

 長々とすみません。上記の様にしてみたのですがカンマ区切りの
表示はされませんでした。何か良い方法はありませんか?

 よろしくお願いいたします。

 すみません。補足です
JFormattedTextFieldに対してsetText((String) value);メソッド
ではまずいと思いsetValueに変更してみたところ画面一部しか表示
されなくなってしまいました。やはりCellRendererでのサポートまで
は考えられていないという事でしょうか?


[ メッセージ編集済み 編集者: matu 編集日時 2004-05-13 12:41 ]
typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2004-05-13 12:41
>setText((String) value);

JFormattedTextFieldでフォーマット編集表示を行なうには、
JFormattedTextField#setValue()メソッドを使用する必要があると
思います。

setText()メソッドは指定された文字列をそのまま出力するだけですから。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2004-05-13 12:47

 typerさんすみません。
 私も同様の間違いに気づき変更してみましたが、setValueにしたとたん
画面が変な表示になってしまいうまく表示されなくなってしまいました。
typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2004-05-13 14:20
例外がスローされていたりしていませんか?
Arai
会議室デビュー日: 2004/01/20
投稿数: 8
投稿日時: 2004-05-13 14:27
こんなのでどうでしょう。

class DataRenderer extends DefaultTableCellRenderer{
final private DecimalFormat formatter;
// = new DecimalFormat("###,###,###,###,###,##0");
public DataRenderer(DecimalFormat formatter_){
formatter = formatter_;
setHorizontalAlignment(JLabel.RIGHT);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column){
setText((value==null)?"":formatter.format(((Double)value).doubleValue()));
return this;
}
}

http://www2.gol.com/users/tame/swing/examples/JTableExamples3.html
は繋がらないから、
http://www.senun.com/Left/Programming/Java_old/Examples_swing/JTableExamples3.html
とか、参考になるのではないかと思います。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2004-05-13 19:30

 できました
setValue(Double.valueOf((String)value));
 としました。

 Araiさんにお教え頂いたサンプルがヒントでした。
ありがとうございます。

 typerさんのおっしゃる通りよくよく見るとNumberFormat
が変換時に例外を出力していました。見落としていました。
すみません。。
java.lang.IllegalArgumentException: Cannot format given Object as a Number

 でもJFormattedTextFieldのsetValueは設定する値について
とても慎重にロジックを組まないとだめですね!?入力時であ
ればNumberFormatでフォーマットしたJFormattedTextFieldに
アルファベットを入れても
JFormattedTextField.REVERT
JFormattedTextField.COMMIT
JFormattedTextField.COMMIT_OR_REVERT
JFormattedTextField.PERSIST
 などの設定によって自動的に戻してくれる様ですがsetValue
の場合は画面がおかしくなって表示さえもされなくなりました。

 ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)