2

そこで、特定の値に達したときに 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();
    }
}
4

2 に答える 2

2

メッセージダイアログを表示すれば、EventQueue#invokeLater()この問題は発生しないはずです。表示後に 21 へのスピンをキャンセルしたい場合は、値を 20 にリセットします。

于 2013-01-07T10:59:20.890 に答える
2

以前のバージョンの Mac OS X で JDK 5 および 6 を使用して、同様の効果を再現できます。この効果は、マウスを使用したときに発生しますが、キーボードでは発生しません

  1. スピナーの上矢印をマウスで押したままにすると、ダイアログが に表示され21ます。

  2. 後でマウスを放して最初のダイアログを閉じると、2 番目のダイアログが表示されます。

  3. マウスを長く保持するほど、報告される値が高くなり、最大値まで増加します。

バージョンを確認する際の参考として、バグ レポートに記載されている関連コードは、 にあるの4 つの呼び出しautoRepeatTimer.stop()です。効果は JDK のバージョンによって異なり、選択した初期遅延内で矢印が繰り返される頻度のアーティファクトである可能性があります。private static class ArrowButtonHandlerBasicSpinnerUI

autoRepeatTimer.setInitialDelay(300);
于 2013-01-07T03:11:59.410 に答える