我开始开发自己的自动完成摇摆组件,我想在用户按下向上或向下键时将焦点设置到列表中,同时让光标放在文本字段上以允许他键入文本或数字。 ..
在向上或向下键入时将焦点设置为JList我已经使用了
list.requestFocus();
有没有办法专注于JTextField上的JList和游标
请在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);
答案 0 :(得分:2)
将焦点放在JTextField
上,但将KeyBindings添加到UP / DOWN键。在操作中,只需更改JList
(public void setSelectedIndex(int index)
方法)
更新
另一种方法是将注意力集中在JList上,并将KeyListener转换为类型化的字符串添加到JTextField中。要显示插入符号
jTextFieldInstance.getCaret().setVisible(true);
jTextFieldInstance.getCaret().setSelectionVisible(true);
答案 1 :(得分: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)是可编辑的,输入的值可以直接添加到数据库中。
将此作为参考并修改代码