- PR -

JSpinnerのFormatの設定について

投稿者投稿内容
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-01-28 17:50
はじめまして。taichiと申します。

下記にあるように記述したところ、
Spinnerの表示は小数第4位まで表示してくれたところまではいいのですが、
NumberModelのStepSizeまで小数第4位でFormatしてくれるため、
表示されている値の丸め誤差が大きくなってしまいます。

私としては、
StepSizeは小数第6位までで計算し、表示は小数第4位にしたいのです。

Eventで処理しようともしましたが、
増減のどちらのボタンが押されたのか判断するように書くことができず、
うまくできませんでした。

どうかご教授お願いします。


private JSpinner TestSpinner(){
SpinnerNumberModel Model =
      new SpinnerNumberModel(0.000000,-50.000000,50.000000,0.023023);
JSpinner spinner = new JSpinner(Model);
JSpinner.NumberEditor editor =
    new JSpinner.NumberEditor(spinner, "0.0000");
spinner.setEditor(editor);
return spinner;
}
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-01-28 20:22
エディタがテキストから値を取得するときに、表示桁以下を
切り捨ててしまうことが原因のようですね。

したがって、JSpinner.NumberEditorのcommitEditを
オーバーライドすることで、おそらくご希望の動作ができますよ。
表示部分が以前の値と変わっていなかったら変更しないようにしてください。
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-01-29 10:31
返答ありがとうございます。

最近Javaを書き出したばかりで、
まだまだ分からないことも多いので
大変助かりました。

早速、そのように書いてみたいと思います。
どうもありがとうございました。
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-01-29 17:19
いろいろ書いてみたのですが、うまく動きません。
commitEditの使用方法がいまいち理解できないのです。

>エディタがテキストから値を取得するときに、表示桁以下を
>切り捨ててしまうことが原因のようですね。
>したがって、JSpinner.NumberEditorのcommitEditを
>オーバーライドすることで、おそらくご希望の動作ができますよ。
Componentとは完全に別の場所で計算してから
値を渡してマスクするということなのでしょうか?

大変恐縮ですが、再度ご教授していただけませんでしょうか。
よろしくお願いいたします。


私としては下記にあるように表示されてほしいです。
<bad Proguram>
[Spinner Display] [Calculated Value]
0.0000 : 0.000000
0.0230 : 0.023000
0.0460 : 0.046000
0.0690 : 0.069000
0.0920 : 0.092000
0.1150 : 0.115000
0.1380 : 0.138000
0.1610 : 0.161000
... : ...

<good Proguram>
[Spinner Display] [Calculated Value]
0.0000 : 0.000000
0.0230 : 0.023023
0.0460 : 0.046046
0.0921 : 0.092092
0.1151 : 0.115115
0.1381 : 0.138138
0.1612 : 0.161161
0.1842 : 0.184184
... : ...
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-01-29 17:37
引用:

taichiさんの書き込み (2004-01-29 17:19) より:
いろいろ書いてみたのですが、うまく動きません。
commitEditの使用方法がいまいち理解できないのです。


私は、こんな風にオーバーライドしてみました。
コード:
public void commitEdit() throws ParseException {
   Object old = getModel().getValue();
   String newStr = getTextField().getText();
   
   try {
      AbstractFormatter formatter = getTextField().getFormatter();
      String oldStr = formatter.valueToString(old);
      
      // 頭の部分が変わってなかったら、変更しない
      if(newStr.startsWith(oldStr)){
         return;
      }
   } catch (ParseException e) {
      // 起こらないハズ 
      e.printStackTrace();
   }
   // 変更を確定させる。
   super.commitEdit();
}


どうでしょう?
taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-02-02 15:47
ご返答ありがとうございます。

私の力が足りないため、どうしても先に進みません。

public class overSpinner extends JSpinner.NumberModel {
public void commitEdit() throws ParseException {
  ..
..
}
}

このようにextendsにJSpinner.NumberModelと記述してもエラーになってしまいます。
この部分をJSpinnerやJFormattedTextFieldとしても同様です。
内部のコードを書き換えてもうまくいきません。

自分でもどうしてよいのか。。。
とりあえず、がんばってみます。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-02-02 16:17
引用:

taichiさんの書き込み (2004-02-02 15:47) より:
私の力が足りないため、どうしても先に進みません。
...
このようにextendsにJSpinner.NumberModelと記述してもエラーになってしまいます。


えっと、commitEdit()をオーバーライドするのはスピナーのモデル(JSpinner.NumberModel)ではなく、エディタ(JSpinner.NumberEditor)ですよ。そもそも、モデルにはcommitEdit()はないですし... (^^;

こんな感じです。
コード:
public class MySpinnerEditor extends JSpinner.NumberEditor {
   public SpinnerEditor2(JSpinner spinner, String decimalFormatPattern) {
      super(spinner, decimalFormatPattern);
   }
   /** JSpinner.NumberEditor#commitEdit()をオーバーライド */
   public void commitEdit() throws ParseException {
      // 前回と同じ
   }
}


で、使うほうは、
コード:
private JSpinner TestSpinner(){ 
   SpinnerNumberModel Model = 
      new SpinnerNumberModel(0.000000,-50.000000,50.000000,0.023023); 
   JSpinner spinner = new JSpinner(Model); 
   JSpinner.NumberEditor editor = 
      new MySpinnerEditor(spinner, "0.0000");  // ここを変更
   spinner.setEditor(editor); 
   return spinner; 
}

taichi
会議室デビュー日: 2004/01/28
投稿数: 14
投稿日時: 2004-02-02 16:56
またお返事いただき、ありがとうございます。

NumberModelは書き間違いでした。すいません。
周りにJavaについて聞ける人がおらず、大変助かります。

下記にあるコードで問題ないと思うのですが、
"SpinnerEditor2"が"メソッドの宣言が不正です。戻り値の型が必要です。"
とエラーになってしまいます。
なぜでしょうか?

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