将焦点设置为JList,并将光标放在文本字段swing java autocomplete上

将焦点设置为JList,并将光标放在文本字段swing java autocomplete上,java,swing,autocomplete,jtextfield,jlist,Java,Swing,Autocomplete,Jtextfield,Jlist,我开始开发自己的自动完成swing组件,我想在用户按下向上键或向下键时将焦点设置为列表,同时让光标停留在文本字段上,以允许他键入文本或数字 要在键入up或down时将焦点设置为JList,我使用了 requestFocus() 有没有办法把焦点放在JList上,把光标放在JTextField上 请在中查看图像 这是我的代码: package examples.autocomplete; import java.awt.EventQueue; import java.awt.event.

我开始开发自己的自动完成swing组件,我想在用户按下向上键或向下键时将焦点设置为列表,同时让光标停留在文本字段上,以允许他键入文本或数字

要在键入up或down时将焦点设置为JList,我使用了

requestFocus()

有没有办法把焦点放在JList上,把光标放在JTextField上

请在中查看图像

这是我的代码:

    package examples.autocomplete;

import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;

import com.gestioncaisse.dao.ClientDAO;
import com.gestioncaisse.dao.DAO;
import com.gestioncaisse.dao.MyConnection;
import com.gestioncaisse.pojos.Client;
import com.gestioncaisse.utils.utils;

public class testcombo extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField textField;
    final DAO<Client> clientDao;
    List<Client> list_clients;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testcombo frame = new testcombo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    boolean first_time = true;

    /**
     * Create the frame.
     */
    public testcombo() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        clientDao = new ClientDAO(MyConnection.getInstance());

        list_clients = clientDao.findAll();

        textField = new JTextField();
        textField.setBounds(5, 11, 113, 20);

        textField.setColumns(10);

        final JButton btnNewButton = new JButton("...");
        btnNewButton.setBounds(116, 10, 45, 23);
        contentPane.setLayout(null);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(5, 31, 156, 144);

        final JList list = new JList(
                utils.fromListToObjectTable2Clients(list_clients));
        scrollPane.setViewportView(list);
        list.setVisibleRowCount(5);

        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        contentPane.add(scrollPane);
        contentPane.add(textField);
        contentPane.add(btnNewButton);

        textField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent arg0) {
            }
            @Override
            public void keyReleased(KeyEvent arg0) {
                int a = list.getSelectedIndex();
                if (arg0.getKeyCode() == KeyEvent.VK_UP) {
                    list.requestFocus();
                } else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
                    list.requestFocus();
                } else if (!first_time) {
                } else {
                    first_time = false;
                }
            }
            @Override
            public void keyPressed(KeyEvent arg0) {

            }
        });

    }
}

//if (a > 0)
//list.setSelectedIndex(a - 1);
//int first_vis = list.getFirstVisibleIndex();
//list.setListData(utils.fromListToObjectTable2Clients(clientDao.findByString(textField.getText())));
//list.setSelectedIndex(0);
package examples.autocomplete;
导入java.awt.EventQueue;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.ListSelectionModel;
导入javax.swing.border.EmptyBorder;
导入com.gestioncaisse.dao.ClientDAO;
导入com.gestioncaisse.dao.dao;
导入com.gestioncaisse.dao.MyConnection;
导入com.gestioncaisse.pojos.Client;
导入com.gestioncaisse.utils.utils;
公共类testcombo扩展了JFrame{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有JPanel内容窗格;
私有JTextField textField;
最终的DAO客户端DAO;
列出客户名单;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
testcombo框架=新的testcombo();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
布尔第一时间=真;
/**
*创建框架。
*/
公共测试组合(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
clientDao=newclientdao(MyConnection.getInstance());
list_clients=clientDao.findAll();
textField=新的JTextField();
textField.setBounds(5,11,113,20);
textField.setColumns(10);
最终JButton btnNewButton=新JButton(“…”);
btnNewButton.收进边界(116,10,45,23);
contentPane.setLayout(null);
JScrollPane scrollPane=新的JScrollPane();
滚动窗格.立根(5,31,156,144);
最终JList列表=新JList(
utils.fromListToObjectTable2客户端(列表客户端));
scrollPane.setViewportView(列表);
列表。设置VisibleRowCount(5);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
添加(滚动窗格);
contentPane.add(textField);
contentPane.add(btnewbutton);
addKeyListener(新的KeyListener(){
@凌驾
public void keyTyped(KeyEvent arg0){
}
@凌驾
公共无效密钥已释放(KeyEvent arg0){
int a=list.getSelectedIndex();
if(arg0.getKeyCode()==KeyEvent.VK_UP){
requestFocus();
}else if(arg0.getKeyCode()==KeyEvent.VK_DOWN){
requestFocus();
}如果(!第一次){
}否则{
第一次=错误;
}
}
@凌驾
按下公共无效键(KeyEvent arg0){
}
});
}
}
//如果(a>0)
//列表.设置选定的索引(a-1);
//int first_vis=list.getFirstVisibleIndex();
//setListData(utils.fromListToObjectTable2Clients(clientDao.findByString(textField.getText()));
//列表。设置所选索引(0);

将焦点保留在
JTextField
上,但添加到向上/向下键。在操作中,只需更改
JList
中的选择(
public void setSelectedIndex(int index)
方法)

更新

另一种方法是将重点放在JList上,并向JTextField添加KeyListener转换类型化字符。使用插入符号

jTextFieldInstance.getCaret().setVisible(true);
jTextFieldInstance.getCaret().setSelectionVisible(true);

将焦点保留在
JTextField
上,但添加到向上/向下键。在操作中,只需更改
JList
中的选择(
public void setSelectedIndex(int index)
方法)

更新

另一种方法是将重点放在JList上,并向JTextField添加KeyListener转换类型化字符。使用插入符号

jTextFieldInstance.getCaret().setVisible(true);
jTextFieldInstance.getCaret().setSelectionVisible(true);

这里我用来从数据库中检索匹配的数据

   keywordssearcher.setEditable(true);
    final JTextComponent sfield = (JTextComponent)    keywordssearcher.getEditor().getEditorComponent();
    sfield.setVisible(true);
    sfield.addKeyListener(new KeyAdapter() {

        @Override
        public void keyReleased(KeyEvent ke) {
            SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    comboFilter(sfield.getText(), con);
                }
            });
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (!(sfield.getText().equals("")) || (sfield.getText() == null)) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    addKeyWord(sfield.getText().toString());
                }
            }
        }
    });

  public void comboFilter(String enteredText, Connection ncon) {
    log.info("ncon autosuggest--->" + ncon);
    ArrayList<String> filterArray = new ArrayList<String>();
    String str1 = "";
    try {
        Statement stmt = dc.ConnectDB().createStatement();
        String str = "SELECT k_word FROM T_KeyWords WHERE k_word LIKE '" + enteredText + "%'";
        ResultSet rs = stmt.executeQuery(str);
        while (rs.next()) {
            str1 = rs.getString("k_word");
            filterArray.add(str1);
            con.close();
        }
    } catch (Exception ex) {
        log.error("Error in getting keywords from database" + ex.toString());
        JOptionPane.showMessageDialog(null, "Error in getting keywords from database" + ex.toString());
    }

    if (filterArray.size() > 0) {
        keywordssearcher.setModel(new DefaultComboBoxModel(filterArray.toArray()));
        keywordssearcher.setSelectedItem(enteredText);
        keywordssearcher.showPopup();
    } else {
        keywordssearcher.hidePopup();
    }
}
keywordssearcher.setEditable(true);
最终JTextComponent sfield=(JTextComponent)关键字sarcher.getEditor().getEditorComponent();
sfield.setVisible(true);
addKeyListener(新的KeyAdapter(){
@凌驾
公开无效密钥已释放(密钥事件){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
comboFilter(sfield.getText(),con);
}
});
}
@凌驾
按下公共无效键(按键事件e){
if(!(sfield.getText().equals(“”)| |(sfield.getText()=null)){
如果(例如getKeyCode()==KeyEvent.VK_ENTER){
addKeyWord(sfield.getText().toString());
}
}
}
});
公共无效组合筛选器(字符串输入文本,连接NCO){
log.info(“NCO自动建议-->”+NCO);
ArrayList filterArray=新的ArrayList();
字符串str1=“”;
试一试{
语句stmt=dc.ConnectDB().createStatement();
String str=“从T_关键字中选择k_单词,其中k_单词类似于“+”输入文本+“%””;
结果集rs=stmt.executeQuery(str);
while(rs.next()){
str1=rs.getString(“k_单词”);
过滤器阵列。添加(str1);
con.close();
}
}捕获(例外)