【问题标题】:set focus to JList and have cursor on textField swing java autocomplete将焦点设置为 JList 并将光标放在 textField swing java 自动完成上
【发布时间】:2014-08-29 01:08:26
【问题描述】:

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

在我用过的向上或向下输入时将焦点设置到 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);

【问题讨论】:

  • 邮政编码,您尝试使用。

标签: java swing autocomplete jtextfield jlist


【解决方案1】:

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

更新

另一种方法是关注 JList 并将 KeyListener 转换类型字符添加到 JTextField。要显示插入符号,请使用

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

【讨论】:

  • 我已经尝试过 setSelectedIndex,但它不太方便且速度较慢,在这种情况下,如果所选项目不是我也不知道的,我还必须使其可见
  • @user3747935 JList 具有内置导航(KeyBindings),例如两次按任何字符,肯定只适用于第一次。字符串中的字符(startWith)
  • 那么,你可能会说,那不可能有我想要的??
  • @user3747935 使用逻辑数据库与数据库自动完成。没有Workers Thread就无法创建JTextField,这个问题不会让我感觉,描述谈论JList,关于违反所有规则的代码,对JTextCOMponents使用DocumentListener,否则输入字段有4-5个基本要求无法从添加到 JTextField 的 KeyListener 监听(加上选择与操作的问题,从剪贴板复制粘贴)
  • @grotibo 我不在乎这个帖子你可能或想要做什么,这是另一个用户的帖子或(如果我错了,请纠正我)???
【解决方案2】:

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

   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(jcombobox)是可编辑的,输入的值可以直接添加到数据库中。

以此为参考,修改代码

【讨论】:

  • 我想创建自己的组件,因为我有自己的规范,而且我在检索数据方面没有问题......,我唯一的问题就是这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2020-07-04
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多