2013-07-03 53 views
0

我遇到了JComboBoxJOptionPane對話框的問題。 情況是這樣的:在JComboBox選擇後打開JOptionPane焦點後

  • 它需要從對話框運行,而不是一個框架
  • 之前數據設置需要做任何檢查
  • 後數據設置的改變需要驗證

我的JComboBox在它的初始數據和我有一個ActionListener其中,上選擇,顯示一對話框JOptionPane具有約重新驗證警告。

進行選擇時作出的對話框顯示爲正常,但JComboBox沒有完成它的循環,並保持JComboBox打開,直到單擊該對話框,然後你需要做進一步的點擊選擇一個選項(不管首先點擊按鈕頂部)。

import javax.swing.JPanel; 
import java.awt.Frame; 
import java.awt.BorderLayout; 
import javax.swing.JDialog; 
import javax.swing.JComboBox; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DialogFocus extends JDialog { 

     private static final long serialVersionUID = 1L; 
     private JPanel jContentPane = null; 
     private JComboBox jComboBox = null; 

     public static void main(String[] args) { 
      new DialogFocus(null); 
     } 

     /** 
     * @param owner 
     */ 
     public DialogFocus(Frame owner) { 
      super(owner); 
      initialize(); 
      setLookAndFeel(); 
      this.setVisible(true); 
     } 

     public void setLookAndFeel() { 
      try { 
       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InstantiationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (UnsupportedLookAndFeelException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     /** 
     * This method initializes this 
     * 
     * @return void 
     */ 
     private void initialize() { 
      this.setSize(300, 200); 
      this.setContentPane(getJContentPane()); 
     } 

     /** 
     * This method initializes jContentPane 
     * 
     * @return javax.swing.JPanel 
     */ 
     private JPanel getJContentPane() { 
      if (jContentPane == null) { 
       jContentPane = new JPanel(); 
       jContentPane.setLayout(new BorderLayout()); 
       jContentPane.add(getJComboBox(), BorderLayout.CENTER); 
      } 
      return jContentPane; 
     } 

     /** 
     * This method initializes jComboBox  
     *  
     * @return javax.swing.JComboBox  
     */ 
     private JComboBox getJComboBox() { 
      if (jComboBox == null) { 
       String[] items = {"1", "2", "3", "4", "5"}; 
       jComboBox = new JComboBox(items); 
       jComboBox.addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent e) { 
          showDialog(); 
        } 
       }); 
      } 
      return jComboBox; 
     } 

     protected void showDialog() { 
      JOptionPane.showMessageDialog(this, "Selection made"); 
     } 

} 

我使用的代碼非常複雜,所以我將這裏的代碼的基本示例放在一起。隨着外觀和感覺的設置,它需要2次點擊來點擊一個有效的選項,但沒有它,它需要一次點擊。 (在構造函數中註釋掉setLookAndFeel())。

有沒有人有任何想法如何解決這個問題,以確保它只需要1次點擊,無論外觀和感覺如何?

預先感謝

+0

我不明白你的問題,但你想setPopupVisible(false)時執行actionPerformed? – nachokk

+0

我希望彈出窗口只需單擊一次(而不是一次點擊即可獲得焦點,另一次點擊「確定」)即可完成。沒有使用invokeLater() – Skepi

+0

而不是actionListener,你嘗試了itemListener嗎? – nachokk

回答

1

裹在一個的invokeLater讓組合框重繪本身的代碼示出了對話框之前:

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() 
    { 
     showDialog(); 
    } 
}); 
+0

試過,不幸的是,在類的另一部分有一個布爾集被事先調用(即使在以後調用時也是如此),並且反過來導致問題 – Skepi

+0

此建議適用於您發佈的代碼。如果它不適合你的課程,那麼你需要發佈一個更好的SSCCE。我們對你正在談論的這個布爾字段一無所知。把這裏學到的概念應用到你真正的問題上。也許你需要在你的代碼中的某處添加另一個invokeLater(),以便在顯示對話框之前讓comboBox自己重繪。 – camickr

0

從內部類,以訪問一個變量在所述外類,你需要引用ComboBox.this.myBool。通常情況下,你可以做myBool,如果它是不禮貌的。

public class ComboBox { 

    private boolean myBool = false; 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      boolean myBoolAgain = ComboBox.this.myBool; 
      showDialog(); 
     } 
    }); 
}