Practice makes perfect

[JAVA] SWING (2) 본문

빅데이터/JAVA

[JAVA] SWING (2)

kerpect 2020. 5. 25. 23:34

 

기초적인 스윙 컴포넌트와 상속 관계

 

 

스윙 컴포넌트의 공통 메소드, JComponent메소드

 

 

JLabel, 레이블 컴포넌트

: 문자열이나 이미지를 컴포넌트화 하여 출력하기 위한 목적으로 사용합니다.

 

단순 텍스트 만을 가진 레이블 컴포넌트 생성
JLabel textLabel = new JLabel("사랑합니다");

이미지를 가진 레이블 컴포넌트 생성
ImageIcon image = new ImageIcon("images/sunset.jpg");
JLabel imageLabel = new JLabel(image);

수평 정렬 값을 가진 레이블 컴포넌트 생성
ImageIcon image = new ImageIcon("images/sunset.jpg");
JLabel label = new JLabel("사랑합니다", image, SwingConstants.CENTER);

이미지 파일로부터 이미지를 읽기 위해 ImageIcon 클래스 사용합니다.

다룰 수 있는 이미지 : png, gif, jpg

sunset.jpg의 경로명이 "images/sunset.jpg" 경우

 

public class LabelEx extends JFrame {
	public LabelEx() {
		setTitle("레이블 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());

		JLabel textLabel = new JLabel("사랑합니다.");
		
		ImageIcon beauty = new ImageIcon("images/beauty.jpg"); 
		JLabel imageLabel = new JLabel(beauty);

		ImageIcon normalIcon = new ImageIcon("images/normalIcon.gif"); 
		JLabel label = new JLabel("보고싶으면 전화하세요",
					normalIcon, SwingConstants.CENTER);

		c.add(textLabel);
		c.add(imageLabel);
		c.add(label);

		setSize(400,600);
		setVisible(true);
	}
	public static void main(String [] args) {
		new LabelEx();
	}
}

 

 

 

JCheckBox

: 선택(selected)비선택(deselected)의 두 상태만 가지는 체크 버튼 입니다.

 

class JCheckBoxText extends JFrame {
	
	JTextField jtf ;
	
	JCheckBoxText(){ // 중복선택 가능 
		
		JCheckBox jcb1 = new JCheckBox("java");  
		JCheckBox jcb2 = new JCheckBox("r");
		JCheckBox jcb3 = new JCheckBox("python");
		JCheckBox jcb4 = new JCheckBox("db");
		
		jtf = new JTextField(10); 
		
		Container container = getContentPane();
		container.setLayout(new FlowLayout());
		
		container.add(jcb1);
		container.add(jcb2);
		container.add(jcb3);
		container.add(jcb4);
		container.add(jtf);
	-
		setTitle("JCheckjBox");
		setSize(500,100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
} 
public class JCheckBoxText_ {

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

 

출력값 :

 

 

JCheckBox에서 Item 이벤트 처리)

 

Item 이벤트

:체크 박스나 라디오버튼의 선택 상태가 바뀔 발생하는 이벤트 입니다.

- 마우스나 키보드로 체크박스를 선택 상태를 바꾸는 경우

- 프로그램에서 선택 상태를 바꾸는 경우

 

위의 코드 + ItemListener

class JCheckBoxText extends JFrame implements ItemListener{
	
	JTextField jtf ;
	
	JCheckBoxText(){
		
		JCheckBox jcb1 = new JCheckBox("java");  // 중복선택 가능 
		JCheckBox jcb2 = new JCheckBox("r");
		JCheckBox jcb3 = new JCheckBox("python");
		JCheckBox jcb4 = new JCheckBox("db");
		
		jtf = new JTextField(10); 
		
		Container container = getContentPane();
		container.setLayout(new FlowLayout());
		
		container.add(jcb1);
		container.add(jcb2);
		container.add(jcb3);
		container.add(jcb4);
		container.add(jtf);
		
		// 리스너 등록
		jcb1.addItemListener(this);
		jcb2.addItemListener(this);
		jcb3.addItemListener(this);
		jcb4.addItemListener(this);
		
		setTitle("JChecjBox 실습");
		setSize(500,100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	@Override
	public void itemStateChanged(ItemEvent e) {
		// System.out.println("이벤트 발생");
		// 체크 박스를 선택하면 텍스트 상자에 선택한 내용이 표시된다. 
		
		JCheckBox selectCB = (JCheckBox)e.getItem();
		// 반환형이 object 이다 = 어떤 컴퍼넌트라도 처리 가능하다.
		// 반환형이 obhect 이므로  강제 형변형을 해준다.                                                                 
		
		jtf.setText(selectCB.getText());
		
		switch(selectCB.getText()){
		case "java":
			System.out.println("java해보자");
			break;
		case "r":
			System.out.println("r해보자");
			break;
		case "python":
			System.out.println("python해보자");
			break;
		case "db":
			System.out.println("db해보자");
			break;
		}
	}
} 
public class JCheckBoxText_ {
	public static void main(String[] args) {
		new JCheckBoxText();
	}
}

ActionListener 와 같은 방식으로 method를 overriding 하여 기능을 추가 합니다.

 

출력값:

 

 

● JRadioButton 

: 여러 버튼으로 그룹을 형성하고, 하나만 선택되는 버튼, 다른 버튼이 선택되면 이전에 선택된 버튼은 자동으로 해제됩니다.

 

 체크박스와의 차이점

- 체크 박스는 각 체크박스마다 선택/해제 가능 합니다.

- 라디오 버튼은 그룹에 속한 버튼 중 하나만 선택 상태가 됩나다.

- 이미지를 가진 라디오버튼의 생성 및 다루기는 체크박스와 완전히 동일합니다.

 

버튼 그룹 객체 생성
ButtonGroup group = new ButtonGroup();

라디오버튼 컴포넌트 생성
JRadioButton apple= new JRadioButton("사과");
JRadioButton pear= new JRadioButton("배");
JRadioButton cherry= new JRadioButton("체리");

라디오 버튼을 버튼 그룹에 삽입
group.add(apple);
group.add(pear);
group.add(cherry);

라디오 버튼을 컨테이너에 삽입
container.add(apple);
container.add(pear);
container.add(cherry);

 

예시)

class JRadioButtonTest extends JFrame implements ActionListener{
	
	
	JTextField jtf;
	JRadioButtonTest(){

		// 버튼 그룹 객체를 생성하여 그룹화할 컴포넌트 추가 (하나만 선택된다)
		ButtonGroup bg = new ButtonGroup(); // 버튼을 그룹화 
		JRadioButton jrb1 = new  JRadioButton("승마");
		JRadioButton jrb2 = new  JRadioButton("골프");
		JRadioButton jrb3 = new  JRadioButton("스쿠버");
		JRadioButton jrb4 = new  JRadioButton("글라이딩");
	    jtf = new JTextField(10);
		
		// JRadioButton은 그룹화 하여 하나만 선택되게 한다. 
		bg.add(jrb1); bg.add(jrb2); bg.add(jrb3); bg.add(jrb4);

		Container container = getContentPane();
		container.setLayout(new FlowLayout());
		
		container.add(jrb1);
		container.add(jrb2);
		container.add(jrb3);
		container.add(jrb4);
		container.add(jtf);
		
		jrb1.addActionListener(this);
		jrb2.addActionListener(this);
		jrb3.addActionListener(this);
		jrb4.addActionListener(this);
	
		setTitle("JRadioButton 실습");
		setSize(350,100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		jtf.setText(e.getActionCommand());
	}
}
public class JRadioButton_ {
	public static void main(String[] args) {	
		new JRadioButtonTest();
	}
}

 

결과값:

 

 

JTextField

: 한 줄 짜리 텍스트(문자열) 입력 창을 구현한 컴포넌트 입니다.

- 텍스트 입력 도중 키가 입력되면 Action 이벤트 발생합니다.

- 입력 가능한 문자 개수와 입력 창의 크기는 서로 다릅니다.

 

public class TextFieldEx extends JFrame {
	public TextFieldEx() {
		setTitle("텍스트필드 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		c.add(new JLabel("이름 "));
		c.add(new JTextField(20));
		c.add(new JLabel("학과 "));
		c.add(new JTextField("컴퓨터공학과 ", 20));
		c.add(new JLabel("주소 "));
		c.add(new JTextField("서울시 ...", 20));

		setSize(300,150);
		setVisible(true);
	}
	public static void main(String [] args) {
		new TextFieldEx();
	}
}

출력값:

 

 

JTextField 주요 메소드

- 문자열 편집 불가능하게 하기 : JTextField.setEditable(false);

- 입력 창에 문자열 출력 : JTextField.setText("hello");

- 문자열의 폰트 지정 : JTextField.setFont(new Font("고딕체", Font.ITALIC, 20);

 

TextArea

: 여러 줄을 입력할 수 있는 텍스트 입력 창입니다.

- JScrollPane 컴포넌트에 삽입하면 스크롤바 지원됩니다.

class JTextFieldTextArea extends JFrame{
	
	JTextField jtf;
	JTextArea jta;
	
	JTextFieldTextArea(){
		jtf = new JTextField(10); 
		jta = new JTextArea(7,20); 
		
		Container container = getContentPane();
		container.setLayout(new FlowLayout());
		
		container.add(jtf);
		container.add(jta);

		setTitle("텍스트 필드 & 텍스트 Area 실습");
		setSize(500,200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
}
public class JTextFieldTextArea_ {
	public static void main(String[] args) {
		new JTextFieldTextArea();
	}
}

jtf = new JTextField(10);  크기가 10인 텍스트 필드 객체 생성(10글자가 들어갈 수 있는 크기) ,  한 라인의 입력을 받을 수 있는 컨퍼넌트입니다. 숫자가 입력되기 전에는 아주 작게 보여줍니다.


jta = new JTextArea(7,20); // (7,20) 7행 20열의 텍스트에어리어 생성 , 화면상 7줄이 보입니다.

아쉬운점 : enter를 누르지 않으면 다음 줄로 넘어가지 않습니다.

 

출력값:

 

 

● JComboBox 

: 풀다운 형태의 리스트 컴포넌트를 만들어주는 클래스 입니다.

- 항목(list)를 선택하는 이벤트 처리 ItemListener를 이용 

- 텍스트 필드와 버튼, 그리고 드롭다운 리스트로 구성

 

 

public class ComboBoxEx extends JFrame {
	private String [] fruits = {"apple", "banana", "kiwi", "mango", "pear",
								"peach", "berry", "strawberry", "blackberry"};
	private String [] names = {"kitae", "jaemoon", "hyosoo", "namyun"};
	public ComboBoxEx() {
		setTitle("콤보박스 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());

		JComboBox<String> strCombo = new JComboBox<String>(fruits);
		c.add(strCombo);

		JComboBox<String> nameCombo = new JComboBox<String>();
		for(int i=0; i<names.length; i++)
			nameCombo.addItem(names[i]);
			c.add(nameCombo);

		setSize(300,300);
		setVisible(true);
	}
	public static void main(String [] args) {
		new ComboBoxEx();
	}
}

출력값:

 

 

JList

: 여러 개의 아이템을 리스트 형식으로 보여주고 선택하는 컴포넌트 입니다.

- JComboBox와 기본적으로 같은 기능

- JScrollPaneJlist를 삽입하여 스크롤 가능

 

class JListTest extends JFrame{
	
	String[] sport = {"농구" , "축구" , "배구" , "야구", "테니스", "핸드볼"};
	JListTest(){
		JList<String> jl = new JList<String> (sport); // 제너릭으로 정의해서 사용.
		jl.setVisibleRowCount(3); // 화면에 보여줄 행 수 정의.
		JScrollPane jp = new JScrollPane(jl); //  스크롤바 적용
	
		Container container = getContentPane();
	    container.setLayout(new FlowLayout());
	   
	    container.add(jp); 
        // JList가 탑제된 JScrollPane을 저장시켜줘야 정상적으로 동작이 진행된다. 
	    
		setTitle("리스트 상자 실습");
		setSize(200,200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
}
public class JList_ {
	public static void main(String[] args) {
		new JListTest();
	}
}

 

JList는 하나의 배열로 저장 되는 것이기 때문에 같은 자료형으로 저장해야 합니다. 그래서 제너릭으로 선언해줍니다 .

 

결과값:

 

 

 

● JTabbedPane 

:  그룹 폴더 컴포넌트를 만들어주는 클래스입니다.

 

class JPanelTest extends JFrame{
	
	JPanelTest(){
		
		Container container = getContentPane();
		container.setLayout(new BorderLayout());
		
		// 첫번째 패널 객체 생성 및 컴포넌트 추가 
		JPanel jp1 = new JPanel();
		jp1.setLayout(new GridLayout(5,1));
		jp1.add(new JButton("JAVA"));
		jp1.add(new JButton("R"));
		jp1.add(new JButton("PYTHON"));
		jp1.add(new JButton("DB"));
		jp1.add(new JButton("WEB"));
		
		// 두번쨰 패널 객체 및 컴포넌트 추가 
		JPanel jp2 = new JPanel();
		jp2.setLayout(new GridLayout(4,1));
		jp2.add(new JRadioButton("java")); // JRadioButton 하나만 선택 가능 (ex, 성별)
		jp2.add(new JRadioButton("r"));
		jp2.add(new JRadioButton("python"));
		jp2.add(new JRadioButton("db"));
		
		// 2개의 패널을 J프레임컨테이너에 탑재
		container.add(jp1,BorderLayout.WEST);
		container.add(jp2,BorderLayout.EAST);
		
		setTitle("패널 컨테이너 실습");
		setSize(500,180);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
}
public class JPanelTest_ {
	public static void main(String[] args) {
		new JPanelTest();
	}
}

 

출력값:

 

'빅데이터 > JAVA' 카테고리의 다른 글

[JAVA] JAVA&DATABASE 연결  (0) 2020.05.27
[JAVA] 이클립스, DB 연동 환경설정  (0) 2020.05.26
[JAVA] SWING(1)  (0) 2020.05.23
[JAVA] 네트워크(NETWORK)  (0) 2020.05.23
[JAVA] 스트림(Stream)  (0) 2020.05.20