2012-04-24 182 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