そこで、特定の値に達したときに JSpinner と ChangeEventListener を使用してコードを実行する Java アプリケーションを作成しました。これらの特定の値に達すると、JOptionPane が表示されます。しかし、その後 JSpinner は回転し続けます。したがって、JSpinner が 1 ~ 50 の値を許可し、JSpinner を 20 から 21 に増やした場合、JOptionPane が開いている間は 50 まで増加します。
奇妙なことに、これは Java 1.4.2 の既知のバグでしたが、5.0 で修正されたと思われます (バグ ID: 4840869 )。私はJava 6u37を実行しています。実際、バグの問題で提供されたソース コード (以下に示す) は、バグの元の投稿者に対して行ったのとまったく同じ効果があります。それは間違いなく私のために修正されていません。
これがなぜなのかについて私が考えることができる唯一のことは、私が Mac OS 10.7.5 を実行していて、おそらくバグ修正が何らかの形で私のバージョンに反映されていないということです。この動作を防ぐためにできることはありますか?
これを示すソースコード (元はバグレポートから):
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SpinnerFrame extends JFrame implements ChangeListener {
private JSpinner spinner;
private boolean changing;
private SpinnerFrame() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(getSpinner());
setSize(80,60);
setLocation(200, 300);
setVisible(true);
changing = false;
}
private JSpinner getSpinner() {
if (spinner == null) {
spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(10, 1, 50, 1));
spinner.addChangeListener(this);
}
return spinner;
}
public void stateChanged(ChangeEvent e) {
JSpinner spinner = (JSpinner) e.getSource();
int value = ((Integer) spinner.getValue()).intValue();
System.out.println("Changed to " + value);
if (changing) {
return;
}
changing = true;
if (value > 20) {
JOptionPane.showMessageDialog(this, "20 exceeded");
//While this is up, the JSpinner continues to 50
}
changing = false;
}
public static void main(String[] args) {
new SpinnerFrame();
}
}