- PR -

JSpinnerへの直接入力時の動作。

投稿者投稿内容
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-05-20 20:52
こんにちわ。
JSpinnerの動作についてひとつ質問です。
JSpinnerに直接キーボードから値を入力した時に、
その値をintegerではなく、doubleで扱いたいのですが
どのように記述していいのか分からず困っています。
下記のようにNumberModelを使用して普通にカウントする分には
ちゃんと動作できるんです。
どうかよろしくお願いします。

SpinnerNumberModel model = new SpinnerNumberModel(0.00, -30.555,30.555, 0.005);
JSpinner spinner = new JSpinner(model);

Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-21 10:35
JSpinnerまたは、SpinnerNumberModelのgetValue()メソッドを使えば、
キーボードから入力された値もDouble型で取得できますよ。

コード:
SpinnerNumberModel model = new SpinnerNumberModel(0.00, -30.555,30.555, 0.005); 
JSpinner spinner = new JSpinner(model); 
Double value = (Double)spiner.getValue();
// または (Double)model.getValue();

いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-21 10:37
NumberEditor を下記のように使えばいいんじゃないでしょうか?

SpinnerNumberModel model = new SpinnerNumberModel(0.00, -30.555,30.555, 0.005);
JSpinner spinner = new JSpinner(model);
JSpinner.NumberEditor editor = new JSpinner.NumberEditor(spinner, "0.000");
spinner.setEditor(editor);
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-05-21 11:34
返答ありがとうございます。
詳しい説明がたりなかったですね。すみません。
私は下記のように記述しています。
問題は、オーバーライドしたsetValue(Object value)がキーボードからの入力の時だけ、Integerになってしまうことです。

>wataさん
前回に引き続き今回もありがとうございます。m(_ _)m


private class SpinnerCommitEdit extends JSpinner.NumberEditor {
private SpinnerCommitEdit(JSpinner spinner, String decimalFormatPattern) {
super(spinner, decimalFormatPattern);
}

public void commitEdit() throws ParseException {
Object old = getModel().getValue();
String newStr = getTextField().getText();

try {
JFormattedTextField.AbstractFormatter formatter = getTextField().getFormatter();
String oldStr = formatter.valueToString(old);

if(newStr.startsWith(oldStr)){
return;
}

} catch (ParseException e) {
e.printStackTrace();
}
super.commitEdit();
}

}

private JSpinner Spinner() {
JSpinner spinner = new JSpinner();
JSpinner.NumberEditor editor = new SpinnerCommitEdit(spinner, "0.000");
spinner.setEditor(editor);
return spinner;
}
private class JSpinnerAAA extends JSpinner {

public void setValue(Object value) {
double sValue = 0.0;
Double Dvalue = Double.valueOf(value.toString());
double dValue = Dvalue.doubleValue();
.
.
.
}
}


SpinnerNumberModel model = new SpinnerNumberModel(0.00, -30.555,30.555,0.005);
JSpinner spinner = new JSpinnerAAA();
spinner.setModel(model);

Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-21 13:10
よくわからないのですが、JSpinner#setValue()をオーバーライドする目的は何ですか?
また、なにをどう判断して「integerになってしまう」とおっしゃられているのですか?
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-05-21 13:31
目的は、まずJSpinnerに対してSpinnerNumberModelを使用して制限をかけているのですが、Max/Minともにユーザーの設定で変化し、Stepは正確には54の逆数するようになっています。しかし、キーボード入力の際にMax/Minが機能せず、それで仕方なくgetValueをオーバーライドして制限をかけたんです。
そしてデバッグの環境でこのSpinnerの動作を見てみると、Spinnerのボタンを押した時はgetvalueのObjectはdoubleの値をもっているのですが、キーボードからの入力の時にはintになってしまっているのです。
キーボードからの入力の時に制限などの設定をするのには、NumberModelではなく別の設定が必要なのでしょうか?

いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-21 14:34
> NumberEditor を下記のように使えばいいんじゃないでしょうか?
>
> SpinnerNumberModel model =
> new SpinnerNumberModel(0.00, -30.555,30.555, 0.005);
> JSpinner spinner = new JSpinner(model);
> JSpinner.NumberEditor editor = new JSpinner.NumberEditor(spinner, "0.000");
> spinner.setEditor(editor);

JSpinnerの初期化時にdoubleを使ったSpinnerNumberModelで
初期化してやれば面倒なことをしなくてもよいはずでが、
素直に上記のようにしてみては
ちょっと確認してみて下さい。
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-05-21 15:23
いっきゅうさんのように変更した場合、
NumberModelのMax/Minはどのように変更したらいいのでしょうか?

今はNumberModelを宣言しているので直接、
NomberModel.setMaximum(new Double(....));としています。
そのように変更した場合、Spinnerから取ってこようにも
Spinner.getModel();ではSpinnerModelだけなので、
NumberModelが取れません。

この辺りの仕組みを私がよくわかっていないことが
一番の問題なのかもしれません。
まだまだ勉強が足りないですね。がんばります。

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