※ GUI 작업
▶ 콤보박스에 추가 하는 방법
1. 콤보박스의 addItem 메서드 이용해서 추가하기 (기존+신규)
- 단순항목추가
cbPdName.addItem("java");
cbPdName.addItem("Spring");
cbPdName.addItem("Oracle");
2. 배열 모델(model) 이용
- model 로 따로 분리해서 작업하는 것 : 콤보 - 모델 - 데이터
- 기존에 있었던것 보두 삭제되고 추가되는 거임
String[] arr = {"사과","배","귤"};
DefaultComboBoxModel cModel = new DefaultComboBoxModel(arr);
cbPdName.setModel(cModel); // 콤보랑 데이터를 모델로 연결
3. vector 모델 이용
- vector = arraylist 이전버전
- 기존에 있었던것 보두 삭제되고 추가되는 거임
Vector<String> vec = new Vector<>();
vec.add("봄");
vec.add("여름");
vec.add("가을");
DefaultComboBoxModel cModel2 = new DefaultComboBoxModel(vec);
cbPdName.setModel(cModel2);
▶ 부모frame 버튼 클릭했을 때 자식 frame 띄우기
- ★ 자식이 부모에 접근해서 뭔가 작업해야됨 = > 부모주소를 넘기자 = this 를 넘기자
부모 LoginGUI
else if(e.getSource()==btJoin){ //회원가입 창 띄우기
MemberFrame f = new MemberFrame(this); // 로그인주소 = this ★자기자신 주소에 들어있음
f.setVisible(true);
자식 MemberFrame
public MemberFrame(LoginGUI loginGui){ // LoginGUI 에서 this 로 넘겼으니까 LoginGUI 로 받아줘야함
this(); //★ 이거 매우 중요함 절대 빼먹으면 안됨 !
this.loginGui=loginGui;
}
부모 MemberFrame
else if(e.getSource()==btDup){
SubUserid f = new SubUserid(this,tfUserid.getText()); //자기자신을 자식에게 넘겨줄꺼니까 this 사용
//userid를 subsuerid 창으로 보내는거
f.setVisible(true);
자식 SubUserid
SubUserid(MemberFrame memberFrame, String userid) {
this();
this.memberFrame = memberFrame;
tfUserid.setText(userid);
}
▶ 자식에서 X 했을 때 자식의 창만 닫히게
setDefaultCloseOperation
private void init() {
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
▶ 검색결과 多 => List 로 묶어서 테이블에 뿌리기
private String[] colNames={"번호","상품명","가격"};
private DefaultTableModel model2=new DefaultTableModel();
...
else if(e.getSource()==btSearch){
try {
int price1 = Integer.parseInt(tfPrice1.getText());
int price2 = Integer.parseInt(tfPrice2.getText());
Vector<PdDTO>list = pdDao.selectByPrice(price1, price2);
String [][] data = new String[list.size()][colNames.length];
for(int i =0 ; i<list.size();i++){
PdDTO dto = list.get(i);
data[i][0] = (dto.getNo()+"");
data[i][1]= (dto.getPdName());
data[i][2] =(dto.getPrice()+"");
data[i][3]=(dto.getRegdate().toString());
data[i][4]= (dto.getDescription());
}
model2.setDataVector(data, colNames);
table2.setModel(model2);
} catch (SQLException ex) {
Logger.getLogger(ProductGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
▶ endBunji가 있을 때만 startBunji와 EndBunji를 연결해서 보여준다.
String startBunji = dto.getStartbunji();
String endbunji = dto.getEndbunji();
String bunji = startBunji;
if (endbunji!=null && !endbunji.isEmpty()) { //end 번지가 null 이 아닐경우
bunji = startBunji + "~" + endbunji; // start 와 end 를 ~ 로 연결해서 출력
}
data[i][4] = bunji;
}
▶ 연결해서 dto에 넣은 것 다시 split 해서 tf 및 cb 에 뿌리기
- 전화번호 cb + tf + tf
- setSelectedItem(arr[0]); : 콤보에 뿌릴때
String hp = dto.getHp();
if(hp!=null && !hp.isEmpty()){ //null체크 필수
String [] arr =hp.split("-");
cbHp1.setSelectedItem(arr[0]); // 010
tfHp2.setText(arr[1]); //1111
tfHp3.setText(arr[2]); //1111
}
- ★이메일 tf + cb + tf
- 도메인이 콤보박스 안에있으면 콤보박스에서 선택하고
콤보박스에 없으면 콤보박스는 직접입력으로 선택해놓고 tfemail3 에 도메인 뿌리기
boolean existEmail=false;
String email=dto.getEmail(); //h@nate.com, h@herb.com, null
if(email!=null && !email.isEmpty()){
String[] arr=email.split("@");
tfEmail1.setText(arr[0]);
String email2 = arr[1]; //nate.com, herb.com
for(String s : emailArr){ //배열에서 하나하나 꺼내서 비교 for문
if(email2.equals(s)){
existEmail=true; //배열 목록안에 존재
break;
}
}//for
if(existEmail){
cbEmail2.setSelectedItem(email2);
}else{
cbEmail2.setSelectedItem("직접입력"); //콤보에 "직접입력" 이라고 써져있는걸 선택해라
tfEmail3.setText(email2);
}
}
▶ 각 컬럼 사이즈 조절
table.getColumnModel().getColumn(0).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(60);
▶ 가격 오른쪽 정렬
DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
dtcr.setHorizontalAlignment(SwingConstants.RIGHT);
table.getColumnModel().getColumn(2).setCellRenderer(dtcr);
※ DAO
▶ DAO 에서 Sql문 like 사용하기
- 특정 동 검색
- select * from zipcode where dong like '논현동'
- ' ? ' => '%' || ? || '%'
String sql = "select * from zipcode where dong like '%'||?||'%'";
▶ regdate 값 timestamp 로 찍히게
- DTO 에서 : 생성자에 넣어줘야 함 / getter setter / toString 다 넣어야함
public PdDTO(int no, String pdName, int price, Timestamp regdate, String description) {
this.no = no;
this.pdName = pdName;
this.price = price;
this.regdate = regdate;
this.description = description;
}
- DAO 에서 : regdate 생략해도 됨
String sql="insert into pd(no, pdname, price, description)"
+ " values (pd_seq.nextval, ?,?, ?)";
- GUI 에서 : 위에서 받아온 값만 다시 받아서 ..엥 여기서도 regdate 따로 언급 안하네 도대체 어떻게 들어간거지 ?
DTO 에서 timestamp 로 선언된것만으로도 들어가나봄
private void addData() throws SQLException {
//1
String pdName=tfPdName.getText();
String price=tfPrice.getText();
String desc=taDesc.getText();
//2
PdDTO dto = new PdDTO();
dto.setPdName(pdName);
dto.setPrice(Integer.parseInt(price));
dto.setDescription(desc);
int cnt=pdDao.insertPd(dto);
▶ setTitle
private void init() {
setTitle("로그인");
}
'JAVA' 카테고리의 다른 글
[JAVA] Thread 스레드 (0) | 2022.04.14 |
---|---|
[JAVA] IO (0) | 2022.04.13 |
[JAVA] AWT.EVENT (0) | 2022.04.06 |
[JAVA] AWT (0) | 2022.04.05 |
[JAVA] DTO / DAO (0) | 2022.04.04 |