2012-04-24 38 views
7

我在我的代碼中有一個JCombobox。我已添加FocusLost event。但它並沒有解僱。我嘗試了很多時間,但沒有找到解決方案。JCombobox focusLost沒有發射,爲什麼?

jcbItemType.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusLost(java.awt.event.FocusEvent evt) { 
     jcbItemTypeFocusLost(evt); 
    } 
}); 

private void jcbItemTypeFocusLost(java.awt.event.FocusEvent evt)          
    {           
     // TODO add your handling code here: 
     System.out.println("name=" + ((Component) evt.getSource()).getName()); 
     System.out.println("index=" + jcbItemType.getSelectedIndex()); 
    } 

但是在控制檯中沒有打印任何內容。請告訴我我做錯了什麼。

回答

6

例如如何監聽Focus源自JTextField/JFormattedTextField

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboBoxTwo extends JFrame implements ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JComboBox mainComboBox; 
    private JComboBox subComboBox; 

    public ComboBoxTwo() { 
     String[] items = {"Select Item", "Color", "Shape", "Fruit"}; 
     String[] subItems1 = {"Select Color", "Red", "Blue", "Green"}; 
     mainComboBox = new JComboBox(items); 
     mainComboBox.addItemListener(this); 
     mainComboBox.addFocusListener(fcsListener); 
     add(mainComboBox, BorderLayout.WEST); 
     subComboBox = new JComboBox(subItems1); 
     subComboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXX"); 
     subComboBox.addItemListener(this); 
     add(subComboBox, BorderLayout.EAST); 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if (e.getStateChange() == ItemEvent.SELECTED) { 
      if (e.getSource() == mainComboBox) { 
       System.out.println("Source : mainComboBox"); 
      } else if (e.getSource() == subComboBox) { 
       System.out.println("Source : subComboBox"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new ComboBoxTwo(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
// 
    private FocusListener fcsListener = new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      System.out.println("Source : " + name(e.getComponent())); 
      System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent();//works for editable JComboBox too 
      if (c instanceof JFormattedTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 
} 
+0

我以前使用過'itemStateChanged',但它對於我的目的是有問題的,因此我想使用FocusLost事件。您的示例對我來說不起作用,儘管您的評論爲*//可用於編輯JComboBox。但它不適合我。請指教。我正在尋找很久。 – sarwar026 2012-04-24 08:41:07

+0

@ sarwar026在這種形式下工作正如我所料,休息是在我的答案中注意到的,使用ItemListener作爲JComboBox,例如在這裏發佈的形式, – mKorbel 2012-04-24 08:50:09

+0

@ sarwar026簡單我不明白爲什麼你必須要求FocusListener ,爲更好的幫助,儘早用[SSCCE]編輯你的問題(http://sscce.org/) – mKorbel 2012-04-24 08:52:03

5

我發現了一個很簡單的方法來解決這個問題。

JComboBox默認編輯器有一個內部類BasicComboBoxEditor $ BorderlessTextField,它是獲取和失去焦點的組件。

可以通過

Component component = comboBox.getEditor().getEditorComponent(); 
if (component instanceof JTextField) 
    JTextField borderlesstextfield = (JTextField) borderless; 

簡單訪問然後像你想補充的焦點監聽任何的JTextField

borderlesstextfield.addFocusListener(new FocusListener() 
{ 
    public void focusGained(FocusEvent e) 
    { 
    } 
    public void focusLost(FocusEvent e) 
    { 
    } 
}}); 

現在你有一個的FocusListener如預期獲得和損失將響應重點爲組合框

+0

這個工作完美,應該是被接受的答案,因爲它遠不那麼複雜! – Xerus 2017-10-10 11:00:50