2013-01-07 75 views
2

因此,我創建了一個Java應用程序,該應用程序使用JSpinner和ChangeEventListener在達到特定值時運行一些代碼。當達到某些值時,會出現一個JOptionPane。但隨後JSpinner繼續旋轉。因此,如果JSpinner允許值爲1-50,並且我已將JSpinner從20增加到21,則在JOptionPane打開時它會一直保持到50。JSpinner繼續旋轉,而JOptionPane顯示在ChangeListener上

奇怪的是,這是Java 1.4.2中的一個已知錯誤,但據推測固定在5.0(Bug 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(); 
    } 
} 

回答

2

我想,如果你表現出在EventQueue#invokeLater()消息對話框中,它不應該有這個問題。如果您想在顯示後取消旋轉至21,只需將值重置爲20之後。

+0

這最終解決了我的問題。實際上,我已經有了一個用於對話框選項的Factory類來簡化代碼參數,所以我很容易實現這一點。非常感謝你! – Thunderforge

+0

我已經發現,這隻適用於單擊向上箭頭,但如果按住向上箭頭,重複對話框仍然會發生。有任何想法嗎? – Thunderforge

+0

檢查對話框當前是否顯示,如果不顯示。 –

2

餘可使用任一JDK 5和6上再現較早版本的Mac OS X上的使用時,會出現效果類似的效果鼠標,但不是的鍵盤。

  1. 當鼠標保持在微調的向上箭頭按下時,出現的對話框中,在21

  2. 當鼠標稍後被釋放並且第一個對話框被解除時,會出現第二個對話框。

  3. 鼠標持續的時間越長,報告的值越高,達到最大值。

對於檢查您的版本,在bug report提到相關的代碼參考爲四個調用autoRepeatTimer.stop()private static class ArrowButtonHandlerBasicSpinnerUI找到。效果因JDK版本而異,可能是箭頭在所選初始延遲內可能重複的頻率的人爲因素。

autoRepeatTimer.setInitialDelay(300); 
+0

我不是很瞭解你的答案,我會做什麼來解決這個問題。有什麼地方我應該叫autoRepeatTimer.setInitialDelay(300)? – Thunderforge

+0

我在JDK版本5和6上報告了我的發現。您是否看到迴歸?我沒有看到更好的解決辦法。爲什麼使用模態對話框報告通過閾值?我會通過一個'PropertyChangeListener'在其他地方舉報[示例](http://stackoverflow.com/a/11832979/230513)。 – trashgod