- - PR -
JSpinnerへの直接入力時の動作。
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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); | ||||
|
投稿日時: 2004-05-21 10:35
JSpinnerまたは、SpinnerNumberModelのgetValue()メソッドを使えば、
キーボードから入力された値もDouble型で取得できますよ。
| ||||
|
投稿日時: 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); | ||||
|
投稿日時: 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); | ||||
|
投稿日時: 2004-05-21 13:10
よくわからないのですが、JSpinner#setValue()をオーバーライドする目的は何ですか?
また、なにをどう判断して「integerになってしまう」とおっしゃられているのですか? | ||||
|
投稿日時: 2004-05-21 13:31
目的は、まずJSpinnerに対してSpinnerNumberModelを使用して制限をかけているのですが、Max/Minともにユーザーの設定で変化し、Stepは正確には54の逆数するようになっています。しかし、キーボード入力の際にMax/Minが機能せず、それで仕方なくgetValueをオーバーライドして制限をかけたんです。
そしてデバッグの環境でこのSpinnerの動作を見てみると、Spinnerのボタンを押した時はgetvalueのObjectはdoubleの値をもっているのですが、キーボードからの入力の時にはintになってしまっているのです。 キーボードからの入力の時に制限などの設定をするのには、NumberModelではなく別の設定が必要なのでしょうか? | ||||
|
投稿日時: 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で 初期化してやれば面倒なことをしなくてもよいはずでが、 素直に上記のようにしてみては ちょっと確認してみて下さい。 | ||||
|
投稿日時: 2004-05-21 15:23
いっきゅうさんのように変更した場合、
NumberModelのMax/Minはどのように変更したらいいのでしょうか? 今はNumberModelを宣言しているので直接、 NomberModel.setMaximum(new Double(....));としています。 そのように変更した場合、Spinnerから取ってこようにも Spinner.getModel();ではSpinnerModelだけなので、 NumberModelが取れません。 この辺りの仕組みを私がよくわかっていないことが 一番の問題なのかもしれません。 まだまだ勉強が足りないですね。がんばります。 | ||||
