javaSwing的JTextField自动补全

直接上代码:

主代码:

package com.test;

import java.awt.*;
 import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;

import org.app.ticket.constants.StationConstant;
import org.app.ticket.helper.TicketHelper;
 
 
 public class AutoCompleteComponet {

     public static void main(String[] args) throws Exception {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFrame frame = new JFrame();
        frame.setTitle("Auto Completion Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(200, 200, 500, 400);
 
         ArrayList<String> items = new ArrayList<String>();
         Map map=TicketHelper.getStationMap(StationConstant.stationString1, StationConstant.stationString2);
         Iterator iterator = map.keySet().iterator();
			while (iterator.hasNext()) {
				String stationName = iterator.next().toString();
				items.add(stationName);
			}
        
         JTextField txtInput = new JTextField();
         setupAutoComplete(txtInput, items);
         txtInput.setColumns(30);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(txtInput, BorderLayout.NORTH);
        frame.setVisible(true);
     }
 
     private static boolean isAdjusting(JComboBox cbInput) {
         if (cbInput.getClientProperty("is_adjusting") instanceof Boolean) {
            return (Boolean) cbInput.getClientProperty("is_adjusting");
        }
         return false;
    }
 
    private static void setAdjusting(JComboBox cbInput, boolean adjusting) {
        cbInput.putClientProperty("is_adjusting", adjusting);
     }
 
     public static void setupAutoComplete(final JTextField txtInput, final ArrayList<String> items) {
         final DefaultComboBoxModel model = new DefaultComboBoxModel();
        final JComboBox cbInput = new JComboBox(model) {
             public Dimension getPreferredSize() {
                 return new Dimension(super.getPreferredSize().width, 0);
             }
         };
         setAdjusting(cbInput, false);
         for (String item : items) {
            model.addElement(item);
        }
        cbInput.setSelectedItem(null);
         cbInput.addActionListener(new ActionListener() {
             @Override
            public void actionPerformed(ActionEvent e) {
                 if (!isAdjusting(cbInput)) {
                     if (cbInput.getSelectedItem() != null) {
                        txtInput.setText(cbInput.getSelectedItem().toString());
                     }
                 }
             }
         });
 
         txtInput.addKeyListener(new KeyAdapter() {
 
             @Override
             public void keyPressed(KeyEvent e) {
                 setAdjusting(cbInput, true);
                 if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                    if (cbInput.isPopupVisible()) {
                        e.setKeyCode(KeyEvent.VK_ENTER);
                     }
                }
                if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
                    e.setSource(cbInput);
                     cbInput.dispatchEvent(e);
                     if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                         txtInput.setText(cbInput.getSelectedItem().toString());
                        cbInput.setPopupVisible(false);
                     }
                 }
                 if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                     cbInput.setPopupVisible(false);
                 }
                setAdjusting(cbInput, false);
             }
         });
       txtInput.getDocument().addDocumentListener(new DocumentListener() {
             public void insertUpdate(DocumentEvent e) {
                 updateList();
             }
 
             public void removeUpdate(DocumentEvent e) {
                updateList();
            }
 
             public void changedUpdate(DocumentEvent e) {
                 updateList();
             }
 
             private void updateList() {
                 setAdjusting(cbInput, true);
                 model.removeAllElements();
                 String input = txtInput.getText();
                 if (!input.isEmpty()) {
                     for (String item : items) {
                         if (item.toLowerCase().startsWith(input.toLowerCase())) {
                             model.addElement(item);
                        }
                     }
                 }
                 cbInput.setPopupVisible(model.getSize() > 0);
                 setAdjusting(cbInput, false);
             }
         });
        txtInput.setLayout(new BorderLayout());
         txtInput.add(cbInput, BorderLayout.SOUTH);
     }
 }

分解数据代码:

/**
	 * 获取站点所对应的站点名
	 * @param stations1  站点的字符串一
	 * @param stations2 站点的字符串二    因为一个字符串装不下
	 * */
	public static Map getStationMap(String stations1,String stations2){
		Map map = new HashMap();
		if(!stations1.equals(null)){
			String[] strs1 = stations1.split("@");
			for(int  i = 1 ; i < strs1.length ; i++){
				String[] strs2 = strs1[i].split("\\|");
				for(int  j = 0 ; j < strs2.length ; j++){
					map.put(strs2[1], strs2[2]);
				}
			}
		}
		if(!stations2.equals(null)){
		String[] strs2 = stations2.split("@");
		for(int  i = 1 ; i < strs2.length ; i++){
			String[] strs3 = strs2[i].split("\\|");
			for(int  j = 0 ; j < strs3.length ; j++){
				map.put(strs3[1], strs3[2]);
			}
		}}
		return map;
	}

数据:

public class StationConstant {
	/**
	 * 此处站点分层2个字符串 因为超过了字符串的存储长度(65535) 中国的火车站点还真是多
	 */
	// 所有站点常量类
	public final static String stationString1 = "@bjb|北京北|VAP|beijingbei|bjb|0@bjd|北京东|BOP|beijingdong|bjd|1@bji|北京|BJP|beijing|bj|2@bjn|北京南|VNP|beijingnan|bjn|3@bjx|北京西|BXP|beijingxi|bjx|4@cqb|重庆北|CUW|chongqingbei|zqb|5@cqi|重庆|CQW|chongqing|zq|6@cqn|重庆南|CRW|chongqingnan|zqn|7@sha|上海|SHH|shanghai|sh|8@shn|上海南|SNH|shanghainan|shn|9@shq|上海虹桥|AOH|shanghaihongqiao|shhq|10@shx|上海西|SXH|shanghaixi|shx|11@tjb|天津北|TBP|tianjinbei|tjb|12@tji|天津|TJP|tianjin|tj|13@tjn|天津南|TIP|tianjinnan|tjn|14@tjx|天津西|TXP|tianjinxi|tjx|15@cch|长春|CCT|changchun|cc|16@ccn|长春南|CET|changchunnan|ccn|17@ccx|长春西|CRT|changchunxi|ccx|18@cdd|成都东|ICW|chengdudong|cdd|19@cdn|成都南|CNW|chengdunan|cdn|20@cdu|成都|CDW|chengdu|cd|21@csh|长沙|CSQ|changsha|cs|22@csn|长沙南|CWQ|changshanan|csn|23@fzh|福州|FZS|fuzhou|fz|24@fzn|福州南|FYS|fuzhounan|fzn|25@gya|贵阳|GIW|guiyang|gy|26@gzb|广州北|GBQ|guangzhoubei|gzb|27@gzd|广州东|GGQ|guangzhoudong|gzd|28@gzh|广州|GZQ|guangzhou|gz|29@gzn|广州南|IZQ|guangzhounan|gzn|30@heb|哈尔滨|HBB|haerbin|heb|31@hed|哈尔滨东|VBB|harbindong|hebd|32@hex|哈尔滨西|VAB|haerbinxi|hebx|33@hfe|合肥|HFH|hefei|hf|34@hfx|合肥西|HTH|hefeixi|hfx|35@hhd|呼和浩特东|NDC|huhehaotedong|hhhtd|36@hht|呼和浩特|HHC|hohhot|hhht|37@hkd|海口东|HMQ|haikoudong|hkd|38@hko|海口|VUQ|haikou|hk|39@hzh|杭州|HZH|hangzhou|hz|40@hzn|杭州南|XHH|hangzhounan|hzn|41@jna|济南|JNK|jinan|jn|42@jnd|济南东|JAK|jinandong|jnd|43@jnx|济南西|JGK|jinanxi|jnx|44@kmi|昆明|KMM|kunming|km|45@kmx|昆明西|KXM|kunmingxi|kmx|46@lsa|拉萨|LSO|lasa|ls|47@lzd|兰州东|LVJ|lanzhoudong|lzd|48@lzh|兰州|LZJ|lanzhou|lz|49@lzx|兰州西|LAJ|lanzhouxi|lzx|50@nch|南昌|NCG|nanchang|nc|51@nji|南京|NJH|nanjing|nj|52@njn|南京南|NKH|nanjingnan|njn|53@njx|南京西|NIH|nanjingxi|njx|54@nni|南宁|NNZ|nanning|nn|55@sjb|石家庄北|VVP|shijiazhuangbei|sjzb|56@sjz|石家庄|SJP|shijiazhuang|sjz|57@sya|沈阳|SYT|shenyang|sy|58@syb|沈阳北|SBT|shenyangbei|syb|59@syd|沈阳东|SDT|shenyangdong|syd|60@tyb|太原北|TBV|taiyuanbei|tyb|61@tyd|太原东|TDV|taiyuandong|tyd|62@tyu|太原|TYV|taiyuan|ty|63@wha|武汉|WHN|wuhan|wh|64@wjx|王家营西|KNM|wangjiayingxi|wjyx|65@wlq|乌鲁木齐|WMR|wulumuqi|wlmq|66@xab|西安北|EAY|xianbei|xab|67@xan|西安|XAY|xian|xa|68@xan|西安南|CAY|xiannan|xan|69@xnx|西宁西|XXO|xiningxi|xnx|70@ych|银川|YIJ|yinchuan|yc|71@ycn|银川南|YEJ|yinchuannan|ycn|72@zzh|郑州|ZZF|zhengzhou|zz|73@aes|阿尔山|ART|aershan|aes|74@aka|安康|AKY|ankang|ak|75@aks|阿克苏|ASR|akesu|aks|76@alh|阿里河|AHX|alihe|alh|77@alk|阿拉山口|AKR|alashankou|alsk|78@api|安平|APT|anping|ap|79@aqi|安庆|AQH|anqing|aq|80@ash|安顺|ASW|anshun|as|81@ash|鞍山|AST|anshan|as|82@aya|安阳|AYF|anyang|ay|83@ban|北安|BAB|beian|ba|84@bbu|蚌埠|BBH|bengbu|bb|85@bch|白城|BCT|baicheng|bc|86@bha|北海|BHZ|beihai|bh|87@bhe|白河|BEL|baihe|bh|88@bji|白涧|BAP|baijian|bj|89@bji|宝鸡|BJY|baoji|bj|90@bji|滨江|BJB|binjiang|bj|91@bkt|博克图|BKX|bugt|bkt|92@bse|百色|BIZ|baise|bs|93@bss|白山市|HJL|baishanshi|bss|94@bta|北台|BTT|beitai|bt|95@btd|包头东|BDC|baotoudong|btd|96@bto|包头|BTC|baotou|bt|97@bts|北屯市|BXR|beitunshi|bts|98@bxi|本溪|BXT|benxi|bx|99@byb|白云鄂博|BEC|bayanobo|byeb|100@byx|白银西|BXJ|baiyinxi|byx|101@bzh|亳州|BZH|bozhou|bz|102@cbi|赤壁|CBN|chibi|cb|103@cde|常德|VGQ|changde|cd|104@cde|承德|CDP|chengde|cd|105@cdi|长甸|CDT|changdian|cd|106@cfe|赤峰|CFD|chifeng|cf|107@cli|茶陵|CDG|chaling|cl|108@cna|苍南|CEH|cangnan|cn|109@cpi|昌平|CPP|changping|cp|110@cre|崇仁|CRG|chongren|cr|111@ctu|昌图|CTT|changtu|ct|112@ctz|长汀镇|CDB|changtingzhen|ctz|113@cxi|崇信|CIJ|chongxin|cx|114@cxi|曹县|CXK|caoxian|cx|115@cxi|楚雄|COM|chuxiong|cx|116@cxt|陈相屯|CXT|chenxiangtun|cxt|117@czb|长治北|CBF|changzhibei|czb|118@czh|长征|CZJ|changzheng|cz|119@czh|池州|IYH|chizhou|cz|120@czh|常州|CZH|changzhou|cz|121@czh|郴州|CZQ|chenzhou|cz|122@czh|长治|CZF|changzhi|cz|123@czh|沧州|COP|cangzhou|cz|124@czu|崇左|CZZ|chongzuo|cz|125@dab|大安北|RNT|daanbei|dab|126@dch|大成|DCT|dacheng|dc|127@ddo|丹东|DUT|dandong|dd|128@dfh|东方红|DFB|dongfanghong|dfh|129@dgd|东莞东|DMQ|dongguandong|dwd|130@dhs|大虎山|DHD|dahushan|dhs|131@dhu|敦煌|DHJ|dunhuang|dh|132@dhu|敦化|DHL|dunhua|dh|133@dhu|德惠|DHT|dehui|dh|134@djc|东京城|DJB|dongjingcheng|djc|135@dji|大涧|DFP|dajian|dj|136@djy|都江堰|DDW|dujiangyan|djy|137@dlb|大连北|DFT|dalianbei|dlb|138@dli|大理|DKM|dali|dl|139@dli|大连|DLT|dalian|dl|140@dna|定南|DNG|dingnan|dn|141@dqi|大庆|DZX|daqing|dq|142@dsh|东胜|DOC|dongsheng|ds|143@dsq|大石桥|DQT|dashiqiao|dsq|144@dto|大同|DTV|datong|dt|145@dyi|东营|DPK|dongying|dy|146@dys|大杨树|DUX|dayangshu|dys|147@dyu|都匀|RYW|duyun|dy|148@dzh|邓州|DOF|dengzhou|dz|149@dzh|达州|RXW|dazhou|dz|150@dzh|德州|DZP|dezhou|dz|151@ejn|额济纳|EJC|ejina|ejn|152@eli|二连|RLC|erlian|el|153@esh|恩施|ESN|enshi|es|154@fcg|防城港|FEZ|fangchenggang|fcg|155@fdi|福鼎|FES|fuding|fd|156@fld|风陵渡|FLV|fenglingdu|fld|157@fli|涪陵|FLW|fuling|fl|158@flj|富拉尔基|FRX|fulaerji|flej|159@fsb|抚顺北|FET|fushunbei|fsb|160@fsh|佛山|FSQ|foshan|fs|161@fxi|阜新|FXD|fuxin|fx|162@fya|阜阳|FYH|fuyang|fy|163@gem|格尔木|GRO|geermu|gem|164@gha|广汉|GHW|guanghan|gh|165@gji|古交|GJV|gujiao|gj|166@glb|桂林北|GBZ|guilinbei|glb|167@gli|古莲|GRX|gulian|gl|168@gli|桂林|GLZ|guilin|gl|169@gsh|固始|GXN|gushi|gs|170@gsh|广水|GSN|guangshui|gs|171@gta|干塘|GNJ|gantang|gt|172@gyu|广元|GYW|guangyuan|gy|173@gzh|赣州|GZG|ganzhou|gz|174@gzl|公主岭|GLT|gongzhuling|gzl|175@gzn|公主岭南|GBT|gongzhulingnan|gzln|176@han|淮安|AUH|huaian|ha|177@hbe|鹤北|HMB|hebei|hb|178@hbe|淮北|HRH|huaibei|hb|179@hbi|淮滨|HVN|huaibin|hb|180@hbi|河边|HBV|hebian|hb|181@hch|潢川|KCN|huangchuan|hc|182@hch|韩城|HCY|hancheng|hc|183@hda|邯郸|HDP|handan|hd|184@hdz|横道河子|HDB|hengdaohezi|hdhz|185@hga|鹤岗|HGB|hegang|hg|186@hgt|皇姑屯|HTT|huanggutun|hgt|187@hgu|红果|HEM|hongguo|hg|188@hhe|黑河|HJB|heihe|hh|189@hhu|怀化|HHQ|huaihua|hh|190@hko|汉口|HKN|hankou|hk|191@hld|葫芦岛|HLD|huludao|hld|192@hle|海拉尔|HRX|hailaer|hle|193@hll|霍林郭勒|HWD|huolinguole|hlgl|194@hlu|海伦|HLB|hailun|hl|195@hma|侯马|HMV|houma|hm|196@hmi|哈密|HMR|hami|hm|197@hna|淮南|HAH|huainan|hn|198@hna|桦南|HNB|huanan|hn|199@hnx|海宁西|EUH|hainingxi|hnx|200@hqi|鹤庆|HQM|heqing|hq|201@hrb|怀柔北|HBP|huairoubei|hrb|202@hro|怀柔|HRP|huairou|hr|203@hsd|黄石东|OSN|huangshidong|hsd|204@hsh|华山|HSY|huashan|hs|205@hsh|黄石|HSN|huangshi|hs|206@hsh|黄山|HKH|huangshan|hs|207@hsh|衡水|HSP|hengshui|hs|208@hya|衡阳|HYQ|hengyang|hy|209@hze|菏泽|HIK|heze|hz|210@hzh|贺州|HXZ|hezhou|hz|211@hzh|汉中|HOY|hanzhong|hz|212@hzh|惠州|HCQ|huizhou|hz|213@jan|吉安|VAG|jian|ja|214@jan|集安|JAL|jian|ja|215@jbc|江边村|JBG|jiangbiancun|jbc|216@jch|晋城|JCF|jincheng|jc|217@jcj|金城江|JJZ|jinchengjiang|jcj|218@jdz|景德镇|JCG|jingdezhen|jdz|219@jfe|嘉峰|JFF|jiafeng|jf|220@jgq|加格达奇|JGX|jagdaqi|jgdq|221@jgs|井冈山|JGG|jinggangshan|jgs|222@jhe|蛟河|JHL|jiaohe|jh|223@jhn|金华南|RNH|jinhuanan|jhn|224@jhx|金华西|JBH|jinhuaxi|jhx|225@jji|九江|JJG|jiujiang|jj|226@jli|吉林|JLL|jilin|jl|227@jme|荆门|JMN|jingmen|jm|228@jms|佳木斯|JMB|jiamusi|jms|229@jni|济宁|JIK|jining|jn|230@jnn|集宁南|JAC|jiningnan|jnn|231@jqu|酒泉|JQJ|jiuquan|jq|232@jsh|江山|JUH|jiangshan|js|233@jsh|吉首|JIQ|jishou|js|234@jta|九台|JTL|jiutai|jt|235@jts|镜铁山|JVJ|jingtieshan|jts|236@jxi|鸡西|JXB|jixi|jx|237@jxi|蓟县|JKP|jixian|jx|238@jxx|绩溪县|JRH|jixixian|jxx|239@jyg|嘉峪关|JGJ|jiayuguan|jyg|240@jyo|江油|JFW|jiangyou|jy|241@jzh|锦州|JZD|jinzhou|jz|242@jzh|金州|JZT|jinzhou|jz|243@kel|库尔勒|KLR|kuerle|kel|244@kfe|开封|KFF|kaifeng|kf|245@kla|岢岚|KLV|kelan|kl|246@kli|凯里|KLW|kaili|kl|247@ksh|喀什|KSR|kashi|ks|248@ksn|昆山南|KNH|kunshannan|ksn|249@ktu|奎屯|KTR|kuitun|kt|250@kyu|开原|KYT|kaiyuan|ky|251@lan|六安|UAH|luan|la|252@lba|灵宝|LBF|lingbao|lb|253@lcg|芦潮港|UCH|luchaogang|lcg|254@lch|隆昌|LCW|longchang|lc|255@lch|陆川|LKZ|luchuan|lc|256@lch|利川|LCN|lichuan|lc|257@lch|临川|LCG|linchuan|lc|258@lch|潞城|UTP|lucheng|lc|259@lda|鹿道|LDL|ludao|ld|260@ldi|娄底|LDQ|loudi|ld|261@lfe|临汾|LFV|linfen|lf|262@lgz|良各庄|LGP|lianggezhuang|lgz|263@lhe|临河|LHC|linhe|lh|264@lhe|漯河|LON|luohe|lh|265@lhu|绿化|LWJ|lvhua|lh|266@lhu|隆化|UHP|longhua|lh|267@lji|丽江|LHM|lijiang|lj|268@lji|临江|LQL|linjiang|lj|269@lji|龙井|LJL|longjing|lj|270@ljy|龙家营|LKP|longjiaying|ljy|271@lli|吕梁|LHV|lvliang|ll|272@lli|醴陵|LLG|liling|ll|273@lpi|滦平|UPP|luanping
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用JTextField的getText()方法获取字符串,然后使用Integer.parseInt()方法将字符串转换为整数类型。例如: JTextField textField = new JTextField(); int num = Integer.parseInt(textField.getText()); ### 回答2: 在JavaSwing组件中,JTextField是一个可编辑的文本框,可以用来输入各种类型的数据,包括整数类型。要从JTextField中获取整数类型的值,需要首先获取JTextField中的文本内容,然后将文本内容转换为整数类型。 获取JTextField中的文本内容可以通过JTextField的getText()方法来实现,例如: ``` String text = jTextField.getText(); ``` 这将返回JTextField中当前的文本内容。接下来需要将文本内容转换为整数类型。转换整数类型有两种方法,一种是使用Integer类的parseInt()方法,另一种是使用Integer类的valueOf()方法。 使用parseInt()方法的示例代码如下: ``` String text = jTextField.getText(); int value = Integer.parseInt(text); ``` 这将返回JTextField中的文本内容转换为整数类型的值。需要注意的是,如果JTextField中的文本内容无法转换为整数类型,将会抛出NumberFormatException异常。 使用valueOf()方法的示例代码如下: ``` String text = jTextField.getText(); Integer integer = Integer.valueOf(text); int value = integer.intValue(); ``` 这将返回JTextField中的文本内容转换为包装类型Integer对象,并将其转换为整数类型的值。需要注意的是,如果JTextField中的文本内容无法转换为整数类型,将会抛出NumberFormatException异常。 总的来说,从JTextField中获取整数类型的值可以使用parseInt()方法或valueOf()方法,需要注意文本内容的格式和异常处理。 ### 回答3: Java Swing中的JTextField组件可以用于获取用户输入的文本信息,但是如何从中获取int类型的数据呢? 首先,我们需要了解JTextField的getText()方法,这个方法会返回一个字符串类型的值,即用户在文本框中输入的内容。因此,我们需要将这个字符串类型的值转换成int类型。 可以使用Java中提供的Integer.parseInt()方法,该方法可以将字符串转换为int类型的值。这个方法的使用非常简单,只需将JTextField组件中的getText()方法返回的值作为参数传入即可。 如下代码所示,将JTextField组件中获取到的字符串转换成int类型并赋给一个整型变量: ``` JTextField textField = new JTextField("123"); int num = Integer.parseInt(textField.getText()); ``` 需要注意的是,如果用户在文本框中输入的内容不是合法的数字类型,比如输入了字母或空格等,那么调用Integer.parseInt()方法时会抛出NumberFormatException异常。因此,在进行转换前需要进行输入验证,确保输入的内容是合法的数字类型。 同时,还可以使用JFormattedTextField组件,它可以设置格式化输入内容的方式,比如只能输入数字、小数点等特定字符。这样可以有效地避免用户输入非法的内容,从而保证程序的正常运行。 总之,获取JTextField中的int类型数据需要将字符串类型的值转换成int类型,同时需要进行输入验证确保输入的内容是合法的数字类型。如果需要更精确的输入控制,可以使用JFormattedTextField组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值