Java - 是否可以将焦点侦听器添加到组合框中?

时间:2013-11-06 03:37:30

标签: java swing focus jcombobox focuslistener

我无法弄清楚如何在comboxbox上实现焦点侦听器。我知道这不是一件简单的事情,但其他人似乎已经让它工作 [1] [2] [3] ,但我无法仔细检查每一个后重复他们的结果。在网上广泛搜索后,查看最新的Oracle guideOracle documentation等,我来到这里。我的问题很简单:

是否可以将焦点侦听器添加到组合框中,如果可以,如何添加?

目标是创建一个与Google搜索基本相同的字段。您可以输入搜索查询,它将填充文本字段下方的下拉列表,并显示可能的搜索匹配项。如果所有其他方法都失败了,我将只有一个comboxbox和一个文本字段在彼此的顶部,并设置一些精细的可见性切换,但我宁愿不... ...

使用:
Java 1.7.0_21 (←旁注:为什么我必须通过这个下划线来斜体化这个文本?下划线做什么?)
Windows 7 x64

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

public class focustest extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    public focustest theframe;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                focustest theframe = new focustest();
                theframe.setVisible(true);
            }
        });
    }

    public focustest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 106);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        JComboBox comboBox = new JComboBox();
        comboBox.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent arg0) {
                JOptionPane.showMessageDialog(theframe, "focus gained!", null,JOptionPane.PLAIN_MESSAGE);
            }
            @Override
            public void focusLost(FocusEvent arg0) {
                JOptionPane.showMessageDialog(theframe, "focus lost!", null,JOptionPane.PLAIN_MESSAGE);
            }
        });
        comboBox.setEditable(true);
        contentPane.add(comboBox, BorderLayout.NORTH);
        textField = new JTextField();
        contentPane.add(textField, BorderLayout.SOUTH);
        textField.setColumns(10);
    }

}

1 个答案:

答案 0 :(得分:3)

comboBox.getEditor().getEditorComponent().addFocusListener(new FocusAdapter() {
   // ....
}

祝你好运。