私はカスタム POS システムを作成しており、ユーザーがダイアログ ボックスを表示する代わりに、テーブルで直接数量を変更できるようにしています。これは、ダミー データを含むテーブルの最初の行です。(まだDBにリンクしていません。)
Price と Amt はどちらも、money 形式を表示するためのカスタム セル レンダラー (正しく表示されないため、誰にもわかりません) を持っています。EDIT:カスタムエディタ(レンダラーではありません、ありがとう)を修正しましたが、以下の問題は引き続き発生します
計画では、ユーザーが数量ボックスに数量を入力すると、金額セル (および画面上部の現在の合計) が更新されるというものでした。これを行うために、データが整数であることを検証するベリファイアを作成し、そのベリファイアを JTextField に追加するだけのカスタム セル エディタにアタッチしました。
画面自体にネストされているため、画面のフィールドとテーブル自体にアクセスできるベリファイア。テーブルモデルに入れたかったのですが、ユーザーがどのセルを選択したのかわかりませんでした。(Verify() は動作するので省略します)
class QtyVerifier extends InputVerifier
{
private int qty = 0;
private BigDecimal pricePerUnit;
private BigDecimal prevamt;
@Override
public boolean shouldYieldFocus(JComponent input)
{
//reset quantity
this.qty = 0;
//verify the results
boolean ok2go = this.verify(input);
if (ok2go)
{
//grab all the current values
this.qty = new Integer(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
this.pricePerUnit = new BigDecimal(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
this.prevamt = new BigDecimal(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
//remove previous amount from the total
addLineCostToRunningTotal(this.prevamt.negate());
//update sales order total
addLineCostToRunningTotal(amt);
//update line total cell
salesOrderFormTable.setValueAt(actualTotal, rowselected, 6);
salesOrderFormTable.validate();
}
else { ... }
return ok2go;
}
....
};
ここが本当に奇妙になるところです。数量がまだ 1 であることを数量に伝えます。セルからすべての適切なデータを取得します。
Selected: 0,1
Quantity in cell 0,1 is 1
Line price is 1.0
Previous amt is 1.0
New amt is 1.0
わかりました。値を 5 に変更して Enter キーを押します。
値を 25 に変更し(この問題を解決)、セルから間違ったデータを取得します。
Quantity in cell 0,1 is 5 //this is correct
Line price is 5.0 //this is incorrect. It should be 1.
Previous amt is 5.0 //also incorrect. This also should be 1.
New amt is 25.0 //this WOULD be correct if the previous data was.
私のテーブルで何が起こっているのですか?! これにより、2 つのセルに完全に間違った情報が表示され、qty セルが入力していないものに変更されるのはなぜですか? これを行う簡単な方法はありますか (ベリファイアの有無にかかわらず)? 注文フォームに間違った費用が表示されることはありません。丸めエラーを防ぐために、すべての値を double から BigDecimals に変更することを検討しましたが、これは丸めエラーでもありません。それは単純に間違っています。私は今完全に迷っています。