9

コードにがありJComboboxます。を追加しましたFocusLost event。しかし、とにかくそれは発火しませんでした。私は多くの時間を試しましたが、解決策が見つかりませんでした。

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());
    }

しかし、コンソールには何も出力されません。私が間違っていることを教えてください。

4

2 に答える 2

9

これを解決する非常に簡単な方法を見つけました。

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) 
     {
     }
}});

これで、ComboBox のフォーカスの獲得と喪失に期待どおりに応答する FocusListener ができました。

于 2013-06-24T21:06:16.060 に答える
7
  • FocusListenerはJComboBoxの適切なリスナーではありません。他のリスナーと一緒にすると、無限のループ(特に、編集可能なJComboBox)を作成できます。

  • FocusListenerは非同期であり、特にJComponentsが別のリスナーを追加した場合は、イベントをキャッチするのが難しい場合があります。

派生からフォーカスをリッスンする方法の例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();
        }
    };
}
于 2012-04-24T07:12:45.287 に答える