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

mDev_97·2022년 1월 11일
0

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개의 댓글

관련 채용 정보