简体   繁体   中英

set focus to JList and have cursor on textField swing java autocomplete

I started to develop my own auto complete swing component and I want to set focus to the list when user press up or down keys and in the same time let the cursor on the textfield to allow him to type text or number....

to set focus to JList when typing up or down I have used

list.requestFocus();

is there any way to have focus on JList and cursor on JTextField

please view the image in here

here my code :

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

Leave the focus on the JTextField but add KeyBindings to the UP/DOWN key. In the actions just change selection in JList ( public void setSelectedIndex(int index) method)

UPDATE

An aslternative way would be to have focus on JList and add KeyListener translating typed chars to the JTextField. To Show caret use

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

Here i used to retrieve matched data from database

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

Here my keywordssearcher(jcombobox) is editable and the entered value can be added directly into the database.

use this as a reference and modify the code

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM