java - 将焦点设置为 JList 并将光标置于 textField swing java 自动完成上

标签 java swing autocomplete jtextfield jlist

我开始开发自己的自动完成 Swing 组件,我想当用户按向上或向下键时将焦点设置到列表,同时让光标位于文本字段上以允许他输入文本或数字。 ..

我使用过在向上或向下打字时将焦点设置到 JList

list.requestFocus();

有什么办法可以让焦点放在 JList 上,光标放在 JTextField 上

请查看here中的图片

这是我的代码:

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

最佳答案

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

更新

另一种方法是专注于 JList 并添加 KeyListener 将键入的字符转换为 JTextField。显示插入符号使用

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

关于java - 将焦点设置为 JList 并将光标置于 textField swing java 自动完成上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24629431/

相关文章:

java - JNI 传递与实际给定的不同的函数参数值

java - 如果 map 中的任何值是空字符串或在 java8 中只是空白,则返回 false

java - 窗口的内容在最小化时消失

jquery - firefox 自动完成 'enter' 自动完成按键触发文本框输入

python - CMD 自动完成无法正常工作

java - 登录和注销 session android

java - java中参数化SELECT语句的问题

java - 重新验证 JPanel 的父框架

java - 在java swings中显示标签和文本字段

ios - 快速更改自动更正工具栏的背景颜色