자바 Swing(스윙) - (4)

2022. 10. 6. 08:41Dev.Program/Java & Spring

728x90

======== JAVA0427 → Ex.java

import javax.swing.JFrame;

public class Ex extends JFrame {

public Ex() {
showFrame();
}

public void showFrame() {
setBounds(600, 400, 300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


setVisible(true);
}



public static void main(String[] args) {
new Ex();
}

}
  • 기본 틀 만들기

 

Design 탭으로 가기

< JPasswordField >

  • Center에 JPasswordField 붙이고
  • North 에 JLable
  • Soute 에 JButton

 

<Ex.java>

  • JTextField 랑 다르게 패스워드는 입력값이 노출안됨

 

다시 Design 탭으로 가기

  • 속성 값 * 로 바꿔보기 (echoChar)
  • 별 모양으로 바뀐다



> 확인버튼에 리스너 연결하기

  • deprecated 처리 됐기 때문에 사용 권장하지 않음
  • getPassword(); 사용 권장!

  • 근데 getPassword()는 char[] 배열 타입 ! String 으로 가져오지 못한다.
  • new 선언으로 인스턴스 생성 (char[] 들고옴)
  • 입력 값 가져옴!



======== Ex2.java (Ex.java 복사해오기)

< JComboBox >

  • 드롭 다운 메뉴 나옴!

 

JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] {"과목 선택", "JAVA", "JSP", "ANDROID"}));
getContentPane().add(comboBox, BorderLayout.CENTER);

.setModel(new DefaultXXXModel ⇒ 계속 나올거

 

  • 지금은 E[] 사용 중인데 우리는 제일 밑에 있는 Vector 사용

 

JComboBox comboBox = new JComboBox();
// String[] 타입을 사용하여 표시할 항목을 생성

// ⇒ 배열이므로 생성 후 크기 고정
// comboBox.setModel(new DefaultComboBoxModel(new String[] {"과목 선택", "JAVA", "JSP", "ANDROID"}));

// Vector 타입을 사용하여 표시할 항목을 생성
// => 컬렉션이므로 생성 후에도 크기(항목) 변경 가능
Vector<String> list = new Vector<String>();
list.add("과목선택");
list.add("JAVA");
list.add("JSP");
list.add("ANDROID");

 

 

comboBox.setModel(new DefaultComboBoxModel<String>(list));
  • 추가
  • 아까랑 실행결과 똑같음

 

// Vector 객체 생성 시 데이터를 한꺼번에 추가하는 방법
Vector<String> list = new Vector<String>(Arrays.asList("과목 선택", "JAVA", "JSP", "ANDROID"));
  • .asList ⇒ List 타입 객체로 되돌려줌
  • 그래도 결과는 같다!
  • 별도의 항목 추가도 가능하다!

 

  • 여기 노란 줄 그이는 이유는 위에 콤보박스에 제네릭 선언이 안되어있어서
  • 처리하면 노란 줄 사라짐(꼭 할 필요는 없다)



  • 콤보박스도 이벤트 달아줄 수 있음

 

JComboBox<String> comboBox = new JComboBox<String>();
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
System.out.println("itemStateChanged");
}
});
  • 2번씩 호출됨
  • 그래서 우린 이거 안쓰고 버튼에 액션리스너 사용

 

  • getselected 메서드 호출하려니 메서드가 3개!

 

btnNewButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("인덱스 : " + comboBox.getSelectedIndex());
System.out.println("아이템 : " + comboBox.getSelectedItem());
}

});
  • 인덱스는 0번부터! (그래서 0번 제외시켜줘야함)

 

>

North 에 JLabel 지우고 JPanel 넣어보기

Panel 안에 JTextField 와 “추가” 라는 JButton 만들기

추가 버튼 눌렀을 때 textField 값 가져오기

  • 추가 누르면 콘솔창에 뜸!

 

> 근데 우리가 하고싶은 건 추가 눌렀을 때 ‘과목 추가’ 리스트 안으로 들어가는 것!

추가 버튼 클릭 시 텍스트필드에 입력된 항목을 JComboBox 에 동적으로 추가

  • 다운캐스팅

 

// JComboBox 에 입력된 텍스트 내용 추가
// 1. JComboBox 객체로부터 Model 객체 가져오기
DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>) comboBox.getModel();

// 2. Model 객체의 addElement() 메서드 호출하여 항목 추가
model.addElement(textField.getText());

 

 

  • 추가 누르니까 리스트로 들어감!



< 동적 select 박스 >

// JComboBox 객체에 ActionListener 직접 적용 가능
comboBox.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("인덱스 : " + comboBox.getSelectedIndex());
System.out.println("아이템 : " + comboBox.getSelectedItem());
}

});
  • 위에 버튼 액션리스너 복사 해 와서 comboBox 로 바꾸기만 하기!

 

  • 확인 안눌러도 이제 콘솔창에 뜸

 

⇒ 쇼핑몰 할 때 동적 select 많이 사용! 카테고리 별로 누르면 바뀌도록….

 

관리자페이지 같은 거 웹으로도 만들고 JAVA 로도 만들 수 있기 때문에… JAVA 로도 만들어보기!



======== Ex3.java(Ex2.java 복사해와서 기본틀만 남기고 다 지우기)

design 탭

< JSpinner >

center - JSpinner

South - JButton

 

JSpinner spinner = new JSpinner();
spinner.setFont(new Font("굴림체", Font.PLAIN, 30));
spinner.setModel(new SpinnerNumberModel(new Integer(0), null, null, new Integer(1)));
getContentPane().add(spinner, BorderLayout.CENTER);
  • 초기값(시작값), 최소값, 최대값




  • Date 탭
  • 근데 얘는 불편해서 많이 안 씀 ( 보통은 칸 다 따로따로 만든다 )



  • List 탭

 

  • 탭 3개 마다 객체들 다 다름!
  • 우리는 제일 복잡한 ListModel 쓸 거
// 1. String[] 객체를 생성하여 항목을 추가하는 방법
// spinner.setModel(new SpinnerListModel(new String[] {"과목을 선택하세요", "JAVA", "JSP", "ANDROID"}));

// 2. Model 객체를 생성하여 항목을 추가하는 방법
spinner.setModel(new SpinnerListModel(Arrays.asList("과목을 선택하세요", "JAVA", "JSP", "ANDROID")));

 

 

System.out.println(spinner.getValue());
  • getValue() 를 통해 값을 가져옴



> Spinner 는 ActionListener 가 없다

  • 대신 ChangeListener 가 있음!
  • 안드로이드에선 이 Spinner 가 ComboBox 역할을 함!



======== Ex4.java 기본 틀 만들기

< JList >

design 탭 가기

Center 에 JList

버튼 필요 없지만 일단 South 에 JButton

  • 누르면 눌러짐
  • ctrl 키를 통해 복수개 선택 가능
  • shift 키를 통해 복수개 연속적 선택 가능

 

> single_interval ~

  • ctrl 선택 안됨 (단일 선택만 가능)



JList list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setModel(new AbstractListModel() {
String[] values = new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"};
public int getSize() {
return values.length;
}
public Object getElementAt(int index) {
return values[index];
}
});
getContentPane().add(list, BorderLayout.CENTER);
  • getSize(), getElementAt() 나중에 안드로이드에서필요

  • 얘는 하나밖에 없음

⇒ 여기까지 주석처리 하기!

 

  • 아까처럼 만들려고 했는데 아까와 달리 파라미터 생성자가 없음! 이 방법이 아니다!

 

  • 벡터타입
// 2. Vector 객체를 생성하여 항목 추가 후 JList 객체에 Vector 객체 추가하는 방법
Vector<String> vList = new Vector<String>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"));
JList list = new JList(vList);
  • 최종!
  • 앞이랑 똑같이 됨!

 

  • 근데 아래부분까지 안보임 ⇒ 스크롤바 필요

< JScrollPane >

  • 필요에 따라 스크롤 자동으로 달아줌!

 

> 일단 리스트 없애기

Center 에 JScrollPane 넣기

 

// 스크롤바 기능을 제공하는 JScrollPane 객체 생성
// => JTable, JList 등 스크롤이 필요한 컴포넌트를 결합하여 사용
JScrollPane scrollPane = new JScrollPane();
// JFrame 또는 JPanel 등 필요한 곳에 JScrollPane 객체 부착
getContentPane().add(scrollPane, BorderLayout.CENTER);

JList list = new JList();
// JScrollPane 객체에 스크롤할 객체를 추가하기 위해
// setViewportView() 메서드에 스크롤바를 동작시킬 객체 전달
scrollPane.setViewportView(list);
  • 이 부분이 중요! 스크롤 만들어서 거기 넣어줘야됨!
  • 나중에 테이블도 이렇게 만들 거 (회원정보 같은 거 뿌릴 때 스크롤바 필수)
Vector<String> vList = new Vector<String>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"));
JList list = new JList(vList);
// JScrollPane 객체에 스크롤할 객체를 추가하기 위해
// setViewportView() 메서드에 스크롤바를 동작시킬 객체 전달
scrollPane.setViewportView(list);
  • 위에꺼 복사해오기
  • 이제 스크롤바 보임

⇒ 주로 테이블이나 리스트에서 많이 쓰임

 

> 이벤트 처리 (버튼에 달 수도 있고, 리스트에 바로 달수도 있다)

일단 버튼에 이벤트 달아보기

> 다중선택일 때와 단일선택일 때 항목 가져오는 방법이 다름

  • getSelectedValue() 와 getSelectedValuesList() 차이!
  • getSelectedValues() 는 deprecate

> 다중 선택 가져오기!




> 디자인탭에서 단일 선택으로 바꿔보기

list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
  • 코드 추가됨

 

  • 단일 모드 항목 가져오기
  • 위에 코드도 제네릭 추가해주기
  • 이제 단일 항목으로 나옴




======== Ex5.java (기본 틀 만들기)

design 탭으로 가기

  • absolute 로 바꾸면 추가할 때 아무곳에나 위치시킬 수 있음
  • 코드보기! 버튼에 setBounds 되어있음
  • 원하는 대로 위치시킬 수 있음!

 

< Layout >

  • 지금까지 배운 4가지  

boarderLayout : 동서남북센터

FlowLayout : 오른쪽으로 → 자리 없으면 아래로

GridLayout : 표랑 같다

absolute : 좌표로 가능

 

< cmd 창 mysql → java >

< member2 테이블 생성 >

필드
1. 번호(idx) INT형 PK(PRIMARY KEY) AI(AUTO_INCREMENT)
2. 이름(name) VARCHAR(20) NN
3. 나이(age) INT형 NN
4. 성별(gender) VARCHAR(2) NN
5. E-Mail(email) VARCHAR(50) NN UN
6. 주민번호(jumin) VARCHAR(14) NN UN

CREATE TABLE member2 (
idx INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT NOT NULL,
gender VARCHAR(20) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE,
jumin VARCHAR(14) NOT NULL UNIQUE
);

 

다시 이클립스로 돌아와서

======== Member2Join.java 만들기

 

  • 오른쪽 정렬



  • 콤보박스 선택 시 잠김
  • 직접입력 선택 시 풀림 → 포커스



 

public boolean inputCheck() {
String nameRegex = "^[가-힣]{2,5}$"; // 한글 2 ~ 5글자
String ageRegex = "^[0-9]{1,3}$"; // 나이 숫자 1 ~ 3자리

// 이름 정규 표현식 틀렸을 때
if(!Pattern.matches(nameRegex, textField.getText())) {
System.out.println("이름을 한글 2 ~ 5 글자로 입력하세요!");
textField.requestFocus();
return false;
}

// 나이 정규 표현식 틀렸을 때
if(!Pattern.matches(ageRegex, textField_1.getText())) {
System.out.println("나이를 숫자 1 ~ 3자로 입력하세요!");
textField_1.requestFocus();
return false;
}

return true;
}
  • 제어할 게 많아서 틀렸을 경우를 false 로 둠!







728x90

'Dev.Program > Java & Spring' 카테고리의 다른 글

MVC2 - (1)  (0) 2022.10.07
자바 Swing(스윙) - (5)  (0) 2022.10.06
자바 Swing(스윙) - (3)  (0) 2022.10.06
자바 Swing(스윙) - (2)  (0) 2022.10.06
DAO/DTO 패턴 / 자바 Swing(스윙) - (1)  (0) 2022.10.06