자바의 기본 스윙 컴포넌트-1

mDev_97·2022년 1월 11일

Java

목록 보기
20/28

GUI를 구성하는 2가지 방법

1. 컴포넌트 기반 GUI 프로그래밍

• GUI 구성이 쉽다.
• 스윙 패키지에 포함된 GUI 컴포넌트를 이용한다.
• 일반적인 GUI 프로그램에 적합하다.

2. 그래픽 기반 GUI 프로그래밍

• 작업 부담이 높다.
• 선, 원, 도형, 이미지 등을 직접 그려 그래픽 화면을 구성한다.
• 자유로운 GUI 프로그램에 적합하다.

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

컴포넌트의 모양과 관련된 메소드

void setForeground(Color) // 전경색 설정(앞쪽색)
void setBackground(Color) // 배경색 설정(뒤쪽색)
void setOpaque(boolean) // 불투명성 설정
void setFont(Font) // 폰트 설정
Font getFont() // 폰트를 리턴

컴포넌트의 상태와 관련된 메소드

void setEnabled(boolean) // 컴포넌트 활성화 설정
void setVisible(boolean) // 컴포넌트 보이기 설정
boolean isVisible() // 컴포넌트 보이기 상태를 리턴

컴포넌트의 위치와 크기에 관련된 메소드

int getWidth() // 가로 크기를 리턴
int getHeight() // 세로 크기를 리턴
int getX() // 컴포넌트의 x 좌표를 리턴
int getY() // 컴포넌트의 y 좌표를 리턴
void setLocation(int, int) // 컴포넌트의 위치를 설정
void setSize(int, int) // 컴포넌트의 크기를 설정

컨테이너에 대한 메소드

Component add(Component) // 자식 컴포넌트를 추가
void remove(Component) // 자식 컴포넌트를 제거
void removeAll(Component) // 모든 자식 컴포넌트를 제거
Container getParent() // 부모 컨테이너를 리턴
Container getTopLevelAncestor() // 최상위 부모 컨테이너를 리턴
Component[] getComponents() // 자식 컴포넌트 배열을 리턴

JLabel(레이블 컴포넌트)

• 문자열이나 이미지를 컴포넌트화하여 출력하기 위해서 사용

생성자

JLabel() // 빈 레이블을 생성

JLabel(Icon image) // 이미지 레이블을 생성
// 예제
ImageIcon img = new ImageIcon("이미지 경로");
JLabel jLabel = new JLabel(img);

JLabel(String text) // 문자열 레이블을 생성
// 예제
JLabel jLabel = new JLabel("문자열 레이블 생성 예제");

JLabel(String text, Icon image, int hAlign)
// 문자열과 이미지를 모두 포함하는 레이블을 생성
// 예제
ImageIcon img = new ImageIcon("이미지 경로");
JLabel jLabel = new JLabel("텍스트 내용", img, SwingConstants.CENTER);
// CENTER, LEFT, RIGHT 중 하나로 설정

예제

import awt.*;
import javax.swing.*;

public class JLabelExample extends JFrame {
    public JLabelExample() {
        super("JLabel 사용 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        JLabel textLabel = new JLabel("텍스트 레이블을 생성!");
        
        ImageIcon img1 = new ImageIcon("이미지 경로");
        // 이미지 경로에는 실제 경로를 작성
        JLabel imgLabel = new JLabel(img);
        
        ImageIcon img2 = new ImageIcon("이미지 경로");
        // 이미지 경로에는 실제 경로를 작성
        JLabel imgTextLabel = new JLabel("오라클", img2, SwingConstants.CENTER);
        
        contentPane.add(textLabel);
        contentPane.add(imgLabel);
        contentPane.add(imgTextLabel);
        
        setSize(480, 600);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new JLabelExample();
    }
}

• 실행 결과

JButton(버튼 컴포넌트)

• 버튼 모양의 컴포넌트
• 버튼을 선택하면 Action 이벤트 발생

생성자

JButton() // 빈 버튼 생성

JButton(Icon image) // 이미지 버튼을 생성
// 예시
JButton("이미지 경로"); // 실제 경로를 입력

JButton(String text) // 문자열 버튼을 생성
// 예시
JButton("문자열을 입력");

JButton(String text, Icon image) // 문자열과 이미지 모두 포함하는 버튼을 생성

이미지 버튼 만들기

하나의 버튼에 3개의 이미지를 연결

• 마우스 접근에 따라서 서로 다른 3개의 이미지를 출력 가능하다.
• 사용자의 버튼 조작에 따른 시각적 이미지를 부여할 수 있다.

  1. 버튼이 기본 상태일 경우 출력되는 이미지
    • 생성자에 이미지를 전달
    • JButton.setIcon(image) 메소드를 통해 이미지 설정

  2. 마우스가 버튼 위에 있을 경우 출력되는 이미지
    • JButton.setRolloverIcon(image) 메소드를 통해 이미지 설정

  3. 마우스가 버튼을 누르고 있는 동안 출력되는 이미지
    • JButton.setPressedIcon(image) 메소드를 통해 이미지 설정

버튼과 레이블의 정렬(Alignment)

• 수평 정렬 : 컴포넌트 내에 이미지와 텍스트의 수평 위치를 정렬

void setHorizontalAlignment(int align)
SwingConstants.(CENTER, LEFT, RIGHT) 중에 하나를 입력

• 수직 정렬 : 컴포넌트 내에 이미지와 텍스트의 수직 위치를 정렬

void setVerticalAlignment(int align)
SwingConstants.(TOP, CENTER, BOTTOM) 중에 하나를 입력

JCheckBox(체크박스 컴포넌트)

• 선택(selected)과 비선택(deselected) 두 가지 상태만 가진다.
• 이미지 아이콘을 가진 체크박스는 체크 박스 모양이 출력되지 않는다.

생성자

JCheckBox() // 빈 체크박스를 생성
JCheckBox(String text) // 문자열 체크박스를 생성
JCheckBox(String text, boolean selected) // 문자열 체크박스를 생성, 체크 상태를 설정
// 예제
JCheckBox jCheckBox = new JCheckBox("문자열 입력");
JCheckbox jCheckBox = new JCheckBox("문자열 입력", true);


JCheckBox(Icon image) // 이미지 체크박스를 생성
JCheckBox(Icon image, boolean selected) // 이미지 체크박스를 생성, 체크 상태를 설정
// 예제
JCheckBox("이미지경로");
JCheckBox("이미지경로", true);


JCheckBox(String text, Icon image) // 문자열과 이미지를 가지는 체크박스를 생성
JCheckBox(String text, Icon image, boolean selected)
// 문자열과 이미지를 가지는 체크박스, 체크 상태를 설정

이미지 아이콘을 가지는 체크 박스 생성 예

• 체크 박스 모양이 출력되지 않는다.
• 선택 상태에 따라 표현하는 이미지 아이콘을 따로 설정해야 한다.

// 실사용에서는 실제 이미지 경로를 입력
ImageIcon normalIcon = new ImageIcon("normalIcon 이미지 경로");
ImageIcon selectedIcon = new ImageIcon("selectIcon 이미지 경로");
JCheckBox jCheckBox = new JCheckBox("예제", normalIcon);
jCheckBox.setSelectedIcon(selectedIcon);

Item 이벤트 처리

• 체크박스 또는 라디오 버트의 선택 상태가 바뀔 때 발생하는 이벤트

JCheckBox jCheckBox = new JCheckBox("버튼");
jCheckBox.setSelected(true);
// 프로그램에서 선택 상태를 변경

• ItemListener 인터페이스의 추상 메소드

void itemStateChanged(ItemEvent e)
// 선택 또는 해제 상태가 변경되는 경우에 호출된다.

• ItemEvent의 주요 메소드

int getStateChange()
// 선택된 경우 ItemEvent.SELECTED를 리턴
// 해제된 경우 ItemEvent.DESELECTED를 리턴

Object getItem()
// 이벤트를 발생시킨 아이템 객체를 리턴

JRadioButton(라디오버튼 컴포넌트)

• 여러 버튼으로 그룹을 형성하고, 하나만 선택되는 버튼
• 다른 버튼을 선택 시, 그 전에 선택한 버튼은 자동으로 선택 해제
• 이미지를 가진 라디오버튼의 생성 및 다루기는 체크박스와 완전히 동일한다.

생성자

JRadioButton() // 빈 라디오버튼을 생성
JRadioButton(String text) // 문자열 라디오버튼을 생성
JRadioButton(String text, boolean selected)
// 문자열 라디오버튼을 생성, 체크 상태를 설정

JRadioButton(Icon image) // 이미지 라디오버튼을 생성
JRadioButton(Icon image, boolean selected)
// 이미지 라디오버튼을 생성, 체크 상태를 설정

JRadioButton(String text, Icon image)
// 문자열과 이미지를 포함하는 라디오버튼을 생성
JRadioButton(String text, Icon image, boolean selected)
// 문자열과 이미지를 포함하는 라디오버튼을 생성, 체크 상태를 설정

라디오 버튼 생성 과정

// 1. 버튼 그룹 객체를 생성한다.
ButtonGroup buttonGroup = new ButtonGroup();

// 2. 라디오버튼을 생성한다.
JRadioButton btn1 = new JRadioButton("btn1");
JRadioButton btn2 = new JRadioButton("btn2");
JRadioButton btn3 = new JRadioButton("btn3");

// 3. 생성한 라디오버튼을 버튼 그룹에 삽입한다.
buttonGroup.add(btn1);
buttonGroup.add(btn2);
buttonGroup.add(btn3);

// 4. 라디오 버튼을 컨테이너에 삽입
Container.add(btn1);
Container.add(btn2);
Container.add(btn3);

JTextField(텍스트 필드 컴포넌트)

• 한 줄짜리 문자열(텍스트) 입력창을 구현한 컴포넌트이다.
• ENTER 키가 입력되면 Action 이벤트가 발생
• 입력 가능한 문자 개수와 입력 창의 크기는 서로 다른다.

생성자

JTextField() // 빈 텍스트필드를 생성
JTextField(int column) // 열의 개수가 column개인 텍스트필드를 생성
JTextField(String text) // text가 입력되어있는 텍스트필드를 생성
JTextField(String text, int column) // 열의 개수는 column개이며, text가 입력되어있는 텍스트필드를 생성

주요 메소드

JTextField.setEditable(false)

• 텍스트필드 내의 문자열을 편집하지 못하게 하는 메소드

JTextField.setText(text)

• 텍스트필드의 입력 창에 문자열을 출력하는 메소드

JTextField.setFont(Font)

• 텍스트필드 의 입력 창의 문자열의 폰트를 지정하는 메소드

예제

import javax.swing.*;
import java.awt.*;

public class TextFieldExample extends JFrame {
    public TextFieldExample() {
        super("텍스트필드 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        contentPane.add(new JLabel("이름"));
        contentPane.add(new JTextField(30));
        contentPane.add(new JLabel("주소"));
        contentPane.add(new JTextField(30));
        contentPane.add(new JLabel("번호"));
        contentPane.add(new JTextField(30));
        
        setSize(300, 200);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new TextFieldExaple();
    }
}

• 실행 결과

TextArea(텍스트영역 컴포넌트)

• 여러 줄을 입력할 수 있는 텍스트 입력 창 컴포넌트
• JScrollPane 컴포넌트에 삽입 시 스크롤바를 지원

생성자

JTextArea() // 빈 텍스트영역을 생성
JTextArea(int rows, int columns) // rows x columns 크기의 텍스트영역을 생성
JTextArea(String text) // text 문자열이 입력된 텍스트영역을 생성
JTextArea(String text, int rows, int columns)
// 입력 창에 text가 입력되어있으며, rows x columns 크기의 텍스트영역을 생성

예제

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextAreaExample {
    public TextAreaExample() {
        super("TextArea 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        contentPane.add(new JLabel("사용 가능한 언어를 입력하세요"));
        JTextField textField = new JTextField(20);
        contentPane.add(textField);
        
        JTextArea textArea = new JTextArea(10, 20);
        contentPane.add(new JScrollPane(textArea));
        
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JTextField inputField = (JTextField)e.getSource();
                textArea.append(inputField.getText() + "\n");
                inputField.setText("");
            }
        });
        
        setSize(300, 300);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new TextAreaExample
    }
}

• 실행 결과

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글