맵 세트는이 예제에서 필요한 데이터 구조에 매우 적합한 키 가치 매핑 관계를 저장할 수 있으며, 각 키는 해당 도시 정보를 구현할 수 있습니다 지도 세트를 사용하여 지방 및 시립 캐스케이드 선택 상자는 지방 정보를 선택할 때 도시 드롭 다운 선택 상자의 해당 콘텐츠를 변경합니다.
아이디어 분석 :
1. 국가, 지방 자치 단체, 자율 지역) 매핑 세트, 즉 LinkedHashMap 객체를 만듭니다. 값은 문자열 유형 1 차원 배열입니다.
코드는 다음과 같습니다.
CityMap.java
코드 사본은 다음과 같습니다.
java.util.linkedhashmap import;
java.util.map import;
공개 클래스 CityMap {
/**
* 국가 (지방, 지방 자치 단체, 자치 지역) 매핑 컬렉션
*/
public static map <String, String []> model = new LinkedHashMap <String, String []> ();
공전{
model.put ( "Beijing", new String [] { "Beijing"});
model.put ( "상하이", 새 문자열 [] { "상하이"});
model.put ( "tianjin", new String [] { "tianjin"});
model.put ( "chongqing", new String [] { "chongqing"});
model.put ( "Heilongjiang", New String [] { "Harbin", "Qiqihar", "Mudanjiang", "Daqing", "Yichun", "Shuangyashan", "Hegang", "Jixi", "Jiamusi", " Qitaihe ","Heihe ","Suihua ","Daxinganling "});
model.put ( "Jilin", new String [] { "Changchun", "Yanbian", "Jilin", "Baishan", "Baicheng", "Siping", "Songyuan", "Liaoyuan", "Da'an" , "Tonghua"});
model.put ( "liaoning", new String [] { "shenyang", "Dalian", "Huludao", "Lushun", "Benxi", "Fushun", "Tieling", "Liaoyang", "Yingkou", ",", ",", " Fuxin ","Chaoyang ","Jinzhou ","Dandong ","Anshan "});
model.put ( "Inner Mongolia", New String [] { "Hohhot", "Hulunbuir", "Xilinhot", "Baotou", "Chipong", "Hailar", "Wuhai", "Ordos", "Tongliao"} );
model.put ( "Hebei", New String [] { "Shijiazhuang", "Tangshan", "Zhangjiakou", "Langfang", "Xingtai", "Handan", "Cangzhou", "Hengshui", "Chengde", " Baoding ","Qinhuangdao "});
Model.put ( "Henan", New String [] { "Zhengzhou", "Kaifeng", "Luoyang", "Pingdingshan", "Jiaozuo", "Hebi", "Xinxiang", "Anyang", "Puyang", " Xuchang ","Luohe ","Sanmenxia ","Nanyang ","Shangqiu ","Xinyang ","Zhoukou ","Zhumadian "});
model.put ( "Shandong", new String [] { "Jinan", "Qingdao", "Zibo", "Weihai", "Qufu", "Linyi", "Yantai", "Zaozhuang", "Liaocheng", ",", ",", " Jining ","Heze ","Tai'an ","Rizhao ","Dongying ","Dezhou ","Binzhou ","Laiwu ","Weifang "});
model.put ( "shanxi", new String [] { "taiyuan", "Yangquan", "Jincheng", "Jinzhong", "Linfen", "Yuncheng", "Changzhi", "Shuozhou", "Xinzhou", " Datong ","Luliang "});
model.put ( "jiangsu", new String [] { "Nanjing", "Suzhou", "Kunshan", "Nantong", "Taicang", "Wuxian", "Xuzhou", "Yixing", "Zhenjiang", " Huaian ","Changshu ","Yancheng ","Taizhou ","Wuxi ","Lianyungang ","Yangzhou ","Changzhou ","Suqian "});
model.put ( "anhui", new String [] { "hefei", "chaohu", "bengbu", "anqing", "lu'an", "chuzhou", "ma'anshan", "fuyang", " Xuancheng ","Tongling ","Huaibei ","Wuhu ","Haozhou ","Suzhou ","Huainan ","Chizhou "});
model.put ( "Shaanxi", new String [] { "Xi'an", "Hancheng", "Ankang", "Hanzhong", "Baoji", "Xianyang", "Yulin", "Weinan", "Shangluo" , "Tongchuan", "Yan'an"});
model.put ( "ningxia", new String [] { "yinchuan", "guyuan", "Zhongwei", "Shizuishan", "Wuzhong"});
model.put ( "gansu", new String [] { "Lanzhou", "Baiyin", "Qingyang", "Jiuquan", "Tianshui", "Wuwei", "Zhangye", "Gannan", "Linxia", " Pingliang ","Dingxi ","Jinchang "});
model.put ( "Qinghai", new String [] { "Xining", "Haibei", "Haixi", "Huangnan", "Goluo", "Yushu", "Haidong", "Hainan"});
model.put ( "hubei", new String [] { "wuhan", "yichang", "huanggang", "enshi", "jingzhou", "shennongjia", "shiyan", "Xianning", "Xiangfan", " Xiaogan ","Suizhou ","Huangshi ","Jingmen ","Ezhou "});
model.put ( "Hunan", new String [] { "Changsha", "Shaoyang", "Chenzhou", "Jishou", "Zhuzhou", "Loudi", "Xiangtan", "Yiyang", " Yongzhou ","Yueyang ","Hengyang ","Huaihua ","Shaoshan ","Zhangjiajie "});
model.put ( "Zhejiang", new String [] { "hangzhou", "huzhou", "jinhua", "ningbo", "lishui", "shaoxing", "yandangshan", "quzhou", "jiaxing", " Taizhou ","Zhoushan ","Wenzhou "});
model.put ( "jiangxi", new String [] { "Nanchang", "Pingxiang", "Jiujiang", "Shangrao", "Fuzhou", "Ji'an", "Yingtan", "Yichun", "Xinyu" , "Jingdezhen", "Ganzhou"});
model.put ( "fujian", new String [] { "fuzhou", "Xiamen", "Longyan", "Nanping", "Ningde", "Putian", "Quanzhou", "Sanming", "Zhangzhou"}) ;
model.put ( "guizhou", new String [] { "guiyang", "anshun", "chishui", "zunyi", "tongren", "liupanshui", "bijie", "kaili", "duyun"}) ;
model.put ( "sichuan", new String [] { "Chengdu", "Luzhou", "Neijiang", "Liangshan", "Aba", "Bazhong", "Guangyuan", "Leshan", "Mianyang", " Deyang ","Panzhihua ","Ya'an ","Yibin ","Zigong ","Ganzizhou ","Dazhou ","Ziyang ","Guang'an ","Suining ","Meishan ","Nanchong " });
model.put ( "Guangdong", New String [] { "Guangzhou", "Shenzhen", "Chaozhou", "Shaoguan", "Zhanjiang", "Huizhou", "Qingyuan", "Dongguan", "Jiangmen", " Maoming ","Zhaoqing ","Shanwei ","Heyuan ","Jieyang ","Meizhou ","Zhongshan ","Deqing ","Yangjiang ","Yunfu ","Zhuhai ","Shantou ","Foshan " });
model.put ( "Guangxi", New String [] { "Nanning", "Guilin", "Yangshuo", "Liuzhou", "Wuzhou", "Yulin", "Guiling", "Hezhou", "Qinzhou", " Guigang ","Fangchenggang ","Baise ","Beihai ","Hechi ","Laibin ","Chongzuo "});
model.put ( "yunnan", new String [] { "kunming", "baoshan", "chuxiong", "dehong", "Honghe", "Lincang", "Nujiang", "Qujing", "Simao", ",", "," Wenshan ","Yuxi ","Zhaotong ","Lijiang ","Dali "});
model.put ( "hainan", new String [] { "haikou", "sanya", "danzhou", "qiongshan", "tongshi", "wenchang"});
model.put ( "Xinjiang", new String [] { "urumqi", "Altay", "Aksu", "Changji", "Hami", "Hotan", "Kashgar", "Karamay", "Shihezi", " Tacheng ","Korla ","Turpan ","yining "});
}
}
2. 주를 얻는 방법을 정의하고, 맵 수집을 만들고, 이전 단계에서 얻은 맵 컬렉션을 할당하고, 맵 컬렉션의 키 세트 () 메소드를 사용하여 Collection, 즉 지방 컬렉션은 객체 유형의 1 차원 배열을 만들고 세트 인터페이스의 ToArray () 메소드를 사용하여 세트 컬렉션을 배열로 변환 하고이 배열을 지방 선택 드롭의 매개 변수로 반환합니다. -다운 목록.
3. Jcombobox 클래스의 setModel () 메소드를 사용하여 지방 정보를 지방 드롭 다운 목록에 추가하십시오. 매개 변수는 이전 단계에서 지방을 얻는 방법입니다.
4. 지방에 따라 도시/카운티를 얻는 방법을 정의하고,지도 수집을 만들고, 1 단계에서 얻은 맵 컬렉션을 할당하고, 맵 컬렉션의 get () 메소드를 사용하여 지정된 키의 값을 얻습니다. 즉, City/County Collection은 String [] 1 차원 배열을 생성하고 City/County 컬렉션을 배열에 할당합니다.
5. 옵션 상태 변경 이벤트를 정의하십시오 removeallitems () JcomBobox 클래스의 메소드는 도시/카운티 목록을 정리하고 선택된 지방에 따라 도시/카운티 배열을 얻고 마지막으로 jcombobox의 setModel () 메소드를 사용하여 도시/카운티의 가치를 다시 설명합니다. 목록.
코드는 다음과 같습니다.
BackgroundPanel.java
코드 사본은 다음과 같습니다.
java.awt.graphics 가져 오기;
import java.awt.image;
import javax.swing.jpanel;
/**
* 배경이있는 패널 어셈블리
*
* @Author Zhongwei Lee
*/
공개 클래스 배경 파넬 확장 jpanel {
/**
*
*/
개인 정적 최종 최종 긴 SerialversionUID = 7758689434195492602L;
/**
* 배경 사진
*/
개인 이미지 이미지;
/**
* 구성 방법
*/
공개 배경 파넬 () {
감독자();
setopaque (false);
setLayout (null);
}
/**
* 사진을 설정하는 방법
*/
public void setImage (이미지 이미지) {
this.image = 이미지;
}
@보수
보호 된 void paintcomponent (그래픽 g) {// 도면 구성 요소의 모양을 다시 작성하십시오.
if (image! = null) {
int width = getWidth (); // 구성 요소 크기를 얻습니다
int height = getheight ();
G.DrawImage (이미지, 0, 0, 너비, 높이, this); // 이미지 그리기는 구성 요소 크기와 동일합니다.
}
super.paintcomponent (g); // 슈퍼 클래스 메소드를 실행합니다
}
}
SwingResourcemanager.java
코드 사본은 다음과 같습니다.
import java.awt.image;
java.awt.toolkit import;
import java.io.bufferedInputStream;
import java.io.BytearRayoutputStream;
import java.io.fileInputStream;
import java.io.ioexception;
import java.io.inputstream;
java.util.hashmap import;
import java.util.iterator;
import javax.swing.imageicon;
/**
* 색상, 글꼴, 이미지 등과 같은 리소스 관리를위한 유틸리티 클래스.
*
*이 클래스는 응용 프로그램이나 플러그인의 일부로 자유롭게 배포 될 수 있습니다.
* <p>
* 저작권 (C) 2003-2004, Instantiations, Inc. <br> 모든 권리 보유
*
* @author scheglov_ke
*/
공개 클래스 SwingResourcEmanager {
/**
* 이미지 이름을 이미지에 맵핑합니다
*/
개인 정적 해시 맵 <문자열, 이미지> m_classimagemap = new Hashmap <문자열, 이미지> ();
/**
* 지정된 입력 스트림으로 인코딩 된 이미지를 반환합니다.
* @Param은 입력 스트림 IS IMEDSTREAM 이미지 데이터를 인코딩하는 입력 스트림
* @return 이미지 지정된 입력 스트림으로 인코딩 된 이미지
*/
개인 정적 이미지 getImage (inputStream is) {
노력하다 {
BytearRayoutputStream Baos = 새로운 BytearRayoutputStream ();
바이트 buf [] = 새로운 바이트 [1024 * 4];
while (true) {
int n = is.read (buf);
if (n == -1)
부서지다;
baos.write (buf, 0, n);
}
baos.close ();
return toolkit.getDefaultToolKit (). createImage (baos.tobytearRay ());
} catch (Throwable e) {
널 리턴;
}
}
/**
* 지정된 클래스에 대한 지정된 경로에서 파일에 저장된 이미지를 반환합니다.
* @Param Clazz Class 이미지를 찾는 것에 대한 클래스
* @Param Path String 이미지 파일의 경로
* @return 이미지 지정된 경로에서 파일에 저장된 이미지
*/
public static image getImage (클래스 <?> 클레이즈, 문자열 경로) {
String key = clazz.getName () + '|' + 경로;
이미지 이미지 = m_classimagemap.get (키);
if (image == null) {
if ((path.length ()> 0) && (path.charat (0) == '/')) {
문자열 newPath = path.SubString (1, path.length ());
image = getImage (new bufferedInputStream (clazz.getClassLoader (). getResourCeasStream (newPath));
} 또 다른 {
image = getImage (clazz.getResourceasstream (Path));
}
m_classimagemap.put (키, 이미지);
}
리턴 이미지;
}
/**
* 지정된 경로에서 파일에 저장된 이미지를 반환합니다.
* @Param Path String 이미지 파일의 경로
* @return 이미지 지정된 경로에서 파일에 저장된 이미지
*/
공개 정적 이미지 getImage (문자열 경로) {
GetImage ( "Default", Path);
}
/**
* 지정된 경로에서 파일에 저장된 이미지를 반환합니다.
* @Param 섹션 문자 캐시의 스토리지 섹션
* @Param Path String 이미지 파일의 경로
* @return 이미지 지정된 경로에서 파일에 저장된 이미지
*/
공개 정적 이미지 getImage (문자열 섹션, 문자열 경로) {
String key = section + '|'
이미지 이미지 = m_classimagemap.get (키);
if (image == null) {
노력하다 {
fileInputStream fis = 새로운 fileInputStream (Path);
image = getImage (fis);
m_classimagemap.put (키, 이미지);
fis.close ();
} catch (ioexception e) {
널 리턴;
}
}
리턴 이미지;
}
/**
* 지정된 섹션에서 캐시 된 이미지를 지우십시오
* @param 섹션 섹션이 지워집니다
*/
public static void clearimages (문자열 섹션) {
for (iterator <string> i = m_classimagemap.keyset (). iterator (); i.hasnext ();) {
문자열 키 = i.next ();
if (! key.startSwith (섹션 + '|'))
계속하다;
이미지 이미지 = m_classimagemap.get (키);
image.flush ();
i.remove ();
}
}
/**
* 지정된 클래스에 대한 지정된 경로에서 파일에 저장된 아이콘을 반환합니다.
* @Param Clazz Class 아이콘을 찾는 클래스
* @Param Path String 아이콘 파일의 경로
* @return 아이콘 지정된 경로에서 파일에 저장된 아이콘
*/
public static imageicon geticon (class <?> Clazz, String Path) {
Geticon 리턴 (GetImage (Clazz, Path));
}
/**
* 지정된 경로에서 파일에 저장된 아이콘을 반환합니다.
* @Param Path String 아이콘 파일의 경로
* @return 아이콘 지정된 경로에서 파일에 저장된 아이콘
*/
public static imageicon geticon (문자열 경로) {
geticon ( "기본값", Path);
}
/**
* 지정된 경로에서 파일에 저장된 아이콘을 반환합니다.
* @Param 섹션 문자 캐시의 스토리지 섹션
* @Param Path String 아이콘 파일의 경로
* @return 아이콘 지정된 경로에서 파일에 저장된 아이콘
*/
public static imageicon geticon (문자열 섹션, 문자열 경로) {
반환 geticon (getImage (섹션, 경로));
}
/**
* 지정된 이미지를 기반으로 아이콘을 반환합니다
* @param 이미지 이미지 원본 이미지
* @return 아이콘 이미지를 기반으로 아이콘
*/
public static imageicon geticon (이미지 이미지) {
if (image == null)
널 리턴;
새로운 ImageIcon (이미지)을 반환합니다.
}
}
mainframe.java
코드 사본은 다음과 같습니다.
java.awt.eventqueue import;
import java.awt.event.itemevent;
import java.awt.event.itemlistener;
java.util.map import;
java.util.set import;
import javax.swing.defaultcomboboxModel;
import javax.swing.jbutton;
import javax.swing.jcombobox;
import javax.swing.jframe;
import javax.swing.jlabel;
import javax.swing.jpanel;
import javax.swing.jtextfield;
import javax.swing.swingconstants;
import javax.swing.uimanager;
import javax.swing.border.titredborder;
공개 클래스 메인 프레임은 JFrame {
/**
*
*/
개인 정적 최종 최종 긴 SerialVersionUID = -4595347311922711984L;
개인 Jtextfield Textfield_3;
개인 jtextfield textfield_1;
개인 jcombobox combobox_1;
개인 Jtextfield Textfield;
개인 Jcombobox Citycombobox;
개인 Jcombobox combobox;
/**
* 응용 프로그램을 시작하십시오
*
* @param args
*/
public static void main (String args []) {
eventqueue.invokelater (new Runnable () {
public void run () {
노력하다 {
uimanager.setLookandFeel ( "com.sun.java.swing.plaf.nimbus.nimbuslookandfeel");
메인 프레임 프레임 = 새로운 메인 프레임 ();
frame.setVisible (true);
} catch (예외 e) {
e.printstacktrace ();
}
}
});
}
/**
* 프레임을 만듭니다
*/
공개 메인 프레임 () {
getContentPane (). setLayout (null);
세트 바운드 (100, 100, 518, 379);
setDefaultCloseOperation (jframe.exit_on_close);
// 기본 도시/카운티를 얻습니다
문자열 주 = (문자열) getProvince () [0];
Settitle ( "지정된 지방/지방 자치 단체를 쿼리하기 위해 해당 도시와 카운티를 입력하십시오");
최종 배경 파넬 BACROU
BackgroundPanel.setImage (SwingResourcemanager.getImage (mainframe.class, "/images/background.jpg"));
BackgroundPanel.SetBounds (0, 0, 510, 380);
getContentPane (). Add (BackgroundPanel);
최종 JPANEL 패널 = 새로운 jpanel ();
PANIL.SETOPAQUE (FALSE);
PANIL.SETBOUNDS (36, 126, 438, 70);
BackgroundPanel.add (패널);
PALEN.SETLAYOUT (NULL);
PALEN.SETBORDER (New 제목의 보더 (NULL, "Place of Residence", 제목의 제목, default_justification, 제목의 제목));
Citycombobox = 새로운 jcombobox ();
Citycombobox.SetBounds (245, 25, 124, 27);
PALEN.ADD (CityCombobox);
Citycombobox.setModel (새로운 DefaultComboBoxModel (getCity (province)));
combobox = 새로운 jcombobox ();
Combobox.SetBounds (25, 25, 124, 27);
PALEN.ADD (COMBOBOX);
combobox.additemlistener (new itemlistener () {
public void itemsTateChanged (Final ItemEvent e) {// 옵션 상태 변경 이벤트
itemchange ();
}
});
Combobox.setModel (새로운 DefaultComboboxModel (getProvince ()));
최종 Jlabel 레이블 = New Jlabel ();
label.settext ( "Province/Metropolis");
label.setbounds (155, 30, 66, 18);
PALEN.ADD (레이블);
최종 Jlabel label_1 = new Jlabel ();
label_1.settext ( "City/County");
label_1. 세트 바운드 (375, 30, 37, 18);
PALEN.ADD (label_1);
최종 Jlabel label_2 = new Jlabel ();
label_2.setbounds (36, 43, 65, 18);
BackgroundPanel.add (label_2);
label_2.sethorizontalalignment (SwingConstants.right);
label_2.SethorizontalTextPosition (SwingConstants.leading);
label_2.settext ( "이름 :");
Textfield = New Jtextfield ();
Textfield.SetBounds (113, 38, 154, 28);
BackgroundPanel.add (텍스트 필드);
최종 Jlabel label_3 = New Jlabel ();
label_3. 세트 바운드 (36, 84, 65, 18);
BackgroundPanel.add (label_3);
label_3.sethorizontalalignment (SwingConstants.right);
label_3.sethorizontaltextPosition (SwingConstants.leading);
label_3.settext ( "성별 :");
combobox_1 = 새로운 jcombobox ();
combobox_1. 세트 바운드 (113, 81, 66, 25);
backgroundpanel.add (combobox_1);
combobox_1.setModel (새로운 defaultComboBoxModel (new String [] { "male", "female"}));
최종 Jlabel label_4 = New Jlabel ();
label_4. 세트 바운드 (36, 212, 65, 18);
BackgroundPanel.add (label_4);
label_4.sethorizontalalignment (SwingConstants.right);
label_4.sethorizontaltextPosition (SwingConstants.leading);
label_4.settext ( "세부 주소 :");
TextField_1 = 새로운 jtextfield ();
TextField_1. 세트 바운드 (113, 208, 367, 28);
BackgroundPanel.add (TextField_1);
최종 Jlabel label_4_1 = New Jlabel ();
label_4_1. 세트 바운드 (36, 252, 65, 18);
BackgroundPanel.add (label_4_1);
label_4_1.SethorizontalTextPosition (SwingConstants.leading);
label_4_1.Sethorizontalalignment (SwingConstants.right);
label_4_1.settext ( "이메일 :");
TextField_3 = 새로운 jtextfield ();
TextField_3.setBounds (113, 248, 367, 27);
BackgroundPanel.add (TextField_3);
최종 JBUTTON 버튼 = 새로운 JBUTTON ();
button.setbounds (159, 289, 75, 28);
BackgroundPanel.add (버튼);
button.settext ( "저장");
최종 Jbutton Button_1 = New Jbutton ();
button_1. 세트 바운드 (265, 289, 75, 28);
backgroundpanel.add (button_1);
button_1.settext ( "재설정");
//
}
/**
* 지방, 지방 자치 단체, 자치 지역을 얻습니다
*
* @반품
*/
공개 대상 [] getProvince () {
map <string, string []> map = citymap.Model; // Province Information을 가져 와서지도에 저장하십시오.
set <string> set = map.keyset ();
Object [] province = set.toArray ();
귀환 주; / 획득 된 지방 정보를 반환합니다
}
/**
* 지정된 지방에 해당하는 도시/카운티를 확보하십시오
*
* @param selectProvince
* @반품
*/
public String [] getCity (String SelectProvince) {
map <string, string []> map = citymap.model; // 맵에 저장하십시오.
String [] arrcity = map.get (selectprovince); // 지정된 키의 값을 얻습니다
반환 Arrcity; // 획득 한 도시/카운티로 돌아갑니다
}
private void itemchange () {
String selectProvince = (String) combobox.getSelectedItem ();
Citycombobox.removeallitems ();
String [] arrcity = getcity (selectprovince); // Get City/County
Citycombobox.SetModel (새로운 DefaultComboBoxModel (Arrcity));
}
}
효과는 그림에 나와 있습니다.