2012-04-24 13 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
  • FocusListener、別のListener(s)は(特に編集可能なJComboBoxの)無限ループを作成することができます完全に、JComboBoxのための適切なリスナーではありません

  • FocusListenerは時々イベントをキャッチするにはあまりにも難しいですが、特に右の注文で、非同期です例でJComponentのは、どのようにをリッスンするために別のListener(s)すぎ

例を追加したこと派生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

+0

@ sarwar026は、私が期待したように動作し、残りは私の答えで気付きました.JComboBox用のItemListenerを使用しています。例えば、ここに投稿したような形式です。 – mKorbel

+0

@ sarwar026シンプルです。なぜ必要なのかわからない理由FocusListener [SSCCE](http://sscce.org/) – mKorbel

5

から私はこれを解決するために非常に簡単な方法を発見しました。

JComboBoxのデフォルトエディタには、内部クラスBasicComboBoxEditor $ BorderlessTextFieldがあり、これはフォーカスを取得してフォーカスを失うコンポーネントです。

それは次に任意のJTextFieldの

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

にあなたのようなフォーカスリスナーを考え追加

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

により簡単にアクセスすることができます今、あなたが期待通りに得るために応答しますのFocusListenerとの損失を持っていますコンボボックスのフォーカス

+0

で質問を編集してください。これは完璧に機能し、受け入れられた答えになるはずです。 – Xerus

関連する問題