我正在尝试使用
javax.swing.JList构建一个javax.swing.JTextField,用于自动完成,如Google.
当写一个字时,Google会显示几场比赛
>当按▼时,我可以使用▲和▼选择一些比赛
>可以用◀和▶编辑我的输入.
>当我按Enter键搜索框中的内容.
>当按Esc键时,盒子将更改为原始输入.
我的意思是关于Bible,我想在我学习这个词时寻找一个特定的单词.我看到了Java2sAutoTextField,但是没有箭头键的这个特殊行为.
解决方法
这需要一个自定义编码组件.绝对是一个扩展JTextField的类,并且在该类中有一个包含JList的JPopupMenu.您必须将JPopupMenu定位在文本字段的正下方,使其看起来像1个组件.
你的下一个诀窍就是在输入时进行过滤.我通常使用Java6 TableRowSorter与我预先填写数据的JTable结合使用.您将需要在JTextField上进行一些变更监听器,并拦截每个键入并获取数据.
>按键
>在DB中执行查询(或者某些数据存储获取类似的条目)
>用这些内容填充JTable
>使用基于JTextField条目的正则表达式设置RowFilter,以过滤检索到的数据
>使用关键听众管理您的操作
编辑
我鞭打了一个样品摇摆应用程序来显示我所说的话.这是一个复制/粘贴示例,应该正常工作(需要JDK 1.6).我基本上得到了你想要的,我把评论放在我告诉你填写空白的地方..例如,Escape键事件被消耗掉,你可以随便做任何事情.
initTableModel()方法只是使用数据初始化表模型.通常,您将要使用数据库或其他数据的动态填充表模型.很多可以调整,但这是例外的缘故;)所以这应该是一个很好的例子,让您修改完成您的目标.不止这个,你必须支付我$$$:)
- package test.text.googleclone;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.Rectangle;
- import java.awt.Toolkit;
- import java.awt.Window;
- import java.awt.event.ActionEvent;
- import java.awt.event.KeyEvent;
- import java.awt.event.KeyListener;
- import java.util.regex.PatternSyntaxException;
- import javax.swing.AbstractAction;
- import javax.swing.BorderFactory;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.JPopupMenu;
- import javax.swing.JTable;
- import javax.swing.JTextField;
- import javax.swing.KeyStroke;
- import javax.swing.ListSelectionModel;
- import javax.swing.RowFilter;
- import javax.swing.event.DocumentEvent;
- import javax.swing.event.DocumentListener;
- import javax.swing.table.DefaultTableModel;
- import javax.swing.table.TableRowSorter;
- public class SearchAutoFillTest {
- private JFrame frame = null;
- private JTextField searchField = null;
- private JPopupMenu popup = null;
- private JTable searchTable = null;
- private TableRowSorter<DefaultTableModel> rowSorter = null;
- private DefaultTableModel searchTableModel = null;
- public SearchAutoFillTest() {
- searchTableModel = new DefaultTableModel();
- initTableModel();
- rowSorter = new TableRowSorter<DefaultTableModel>(searchTableModel);
- searchTable = new JTable(searchTableModel);
- searchTable.setRowSorter(rowSorter);
- searchTable.setFillsViewportHeight(true);
- searchTable.getColumnModel().setColumnSelectionAllowed(false);
- searchTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
- searchTable.getTableHeader().setReorderingAllowed(false);
- searchTable.setPreferredSize(new Dimension(775,100));
- searchTable.setGridColor(Color.WHITE);
- searchField = new JTextField();
- searchField.getDocument().addDocumentListener(new DocumentListener() {
- @Override
- public void changedUpdate(DocumentEvent e) {
- showPopup(e);
- }
- @Override
- public void insertUpdate(DocumentEvent e) {
- showPopup(e);
- }
- @Override
- public void removeUpdate(DocumentEvent e) {
- showPopup(e);
- }
- });
- searchField.addKeyListener(new KeyListener() {
- @Override
- public void keyTyped(KeyEvent e) {
- }
- @Override
- public void keyReleased(KeyEvent e) {
- int code = e.getKeyCode();
- switch(code)
- {
- case KeyEvent.VK_UP:
- {
- cycleTableSelectionUp();
- break;
- }
- case KeyEvent.VK_DOWN:
- {
- cycleTableSelectionDown();
- break;
- }
- case KeyEvent.VK_LEFT:
- {
- //Do whatever you want here
- break;
- }
- case KeyEvent.VK_RIGHT:
- {
- //Do whatever you want here
- break;
- }
- }
- }
- @Override
- public void keyPressed(KeyEvent e) {
- }
- });
- KeyStroke keyStroke = KeyStroke.getKeyStroke("ESCAPE");
- searchField.getInputMap().put(keyStroke,"ESCAPE");
- searchField.getActionMap().put("ESCAPE",new AbstractAction() {
- @Override
- public void actionPerformed(ActionEvent e) {
- //Do what you wish here with the escape key.
- }
- });
- popup = new JPopupMenu();
- popup.add(searchTable);
- popup.setVisible(false);
- popup.setBorder(BorderFactory.createEmptyBorder());
- JPanel searchPanel = new JPanel(new BorderLayout(5,5));
- searchPanel.setBorder(BorderFactory.createEmptyBorder(4,4,4));
- searchPanel.add(searchField,BorderLayout.CENTER);
- frame = new JFrame();
- frame.setLayout(new BorderLayout(5,5));
- frame.add(searchPanel,BorderLayout.NORTH);
- frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
- frame.setSize(800,500);
- center(frame);
- frame.setVisible(true);
- }
- private final void newFilter() {
- RowFilter<DefaultTableModel,Object> rf = null;
- try {
- rf = RowFilter.regexFilter(getFilterText(),0);
- }
- catch(PatternSyntaxException e) {
- return;
- }
- rowSorter.setRowFilter(rf);
- }
- private final String getFilterText() {
- String orig = searchField.getText();
- return "("+orig.toLowerCase()+")|("+orig.toUpperCase()+")";
- }
- private void showPopup(DocumentEvent e) {
- if(e.getDocument().getLength() > 0) {
- if(!popup.isVisible()) {
- Rectangle r = searchField.getBounds();
- popup.show(searchField,(r.x-4),(r.y+16));
- popup.setVisible(true);
- }
- newFilter();
- searchField.grabFocus();
- }
- else {
- popup.setVisible(false);
- }
- }
- private void cycleTableSelectionUp() {
- ListSelectionModel selModel = searchTable.getSelectionModel();
- int index0 = selModel.getMinSelectionIndex();
- if(index0 > 0) {
- selModel.setSelectionInterval(index0-1,index0-1);
- }
- }
- private void cycleTableSelectionDown() {
- ListSelectionModel selModel = searchTable.getSelectionModel();
- int index0 = selModel.getMinSelectionIndex();
- if(index0 == -1) {
- selModel.setSelectionInterval(0,0);
- }
- else if(index0 > -1) {
- selModel.setSelectionInterval(index0+1,index0+1);
- }
- }
- private void initTableModel() {
- String[] columns = new String[] {"A"};
- String[][] data = new String[][]
- {
- new String[] {"a"},new String[] {"aa"},new String[] {"aaab"},new String[] {"aaabb"},new String[] {"aaabbbz"},new String[] {"b"},new String[] {"bb"},new String[] {"bbb"},new String[] {"bbbbbbb"},new String[] {"bbbbbbbeee"},new String[] {"bbbbbbbeeexxx"},new String[] {"ccc"},new String[] {"cccc"},new String[] {"ccccc"},new String[] {"cccccaaaa"},new String[] {"ccccccaaaa"},};
- searchTableModel.setDataVector(data,columns);
- }
- private void center(Window w) {
- int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
- int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
- int windowWidth = w.getWidth();
- int windowHeight = w.getHeight();
- if (windowHeight > screenHeight) {
- return;
- }
- if (windowWidth > screenWidth) {
- return;
- }
- int x = (screenWidth - windowWidth) / 2;
- int y = (screenHeight - windowHeight) / 2;
- w.setLocation(x,y);
- }
- public static void main(String ... args) {
- new SearchAutoFillTest();
- }
- }