기본적인 스윙 컴포넌트와 활용

ChoRong0824·2022년 9월 30일
2

Java_GUI

목록 보기
7/9

Gui를 구성하는 2가지 방법


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

  • 스우이 패키지에 주어진 gui 컴포넌트 이용
  • gui 구성이 쉽다.
  • 자바 패키지에 제공하는 gui 컴포넌트 한계
  • 일반적인 gui 프로그램에 적합

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

  • 선, 원, 도형, 이미지를 직접 그려내는 그래픽 화면 구성
  • 개발자의 작업 부담 높음
  • 자바 패키지에 없는 독특한 Gui 구성 가능
  • 게임 등 자유로은 gui

grid = 가로,세로 나눌 수 있음
layout = 컨테이너에 (바탕되는 것 : contentPane)
adapt -> 인터페이스



JComponent의 메소드

  • 컴포넌트의 모양과 관련된 메소드
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좌표 리턴
Point getLocationOnScreen() //스크린 좌표상에서의 컴포넌트 좌표
void setLocation(int, int) //위치지정
void setSize(int,int) //크기지정
  • 컨테이너를 위한 메소드
Component add(Component) // 자식 컴포넌트 추가
void remove(Component) // 자식 컴포넌트 제거
void removeAll() // 모든 자식 컴포넌트 제거
Component[] getComponents() // 자식 컴포넌트 배열 리턴
Container getParent() // 부모 컨테이너 리턴
Container getTopLevelAncestor() // 최상위 부모 컨테이너 리턴

예제 11-1

package experience;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.temporal.JulianFields;

public class JComponentEx extends JFrame {
    public JComponentEx(){
        super("JComponent의 공통 메소드 예제");
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        JButton b1 = new JButton("Magenta/Yellow Button");
        JButton b2 = new JButton("Disabled Button");
        JButton b3 = new JButton("getX(), getY()");

        b1.setBackground(Color.YELLOW);
        b1.setForeground(Color.MAGENTA);
        b1.setFont(new Font("Arial", Font.ITALIC, 20)); // Arial 폰트,20픽셀
        b2.setEnabled(false); //버튼 비활성화
        b3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton) e.getSource(); //가져온 소스를 버튼형으로 바꿔줌. change
                JComponentEx frame = (JComponentEx) b.getTopLevelAncestor();
                frame.setTitle(b.getX()+","+b.getY()); //타이틀에 버튼 좌표 출력
            }
        });
        c.add(b1);
        c.add(b2);
        c.add(b3);


        setSize(260,200);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JComponentEx();
    }
}

JLabel의 용도

문자열이나 이미지를 컴포넌트화 하여 출력하기 위한 목적


생성자

JLabel() //빈레이블
JLabel(Icon image) // 이미지 레이블
JLabel(String text) // 문자열 레이블
JLabel(String text, Icon image, int hAlign) // 문자열과 이미지를 모두 가진 레이블
- hAlign : 수평 정렬 값으로 SwingConstants.LEFT,
SwingConstants.RiGHT, SwingConstants.CENTER 중 하나

단순 텍스트 만을 가진 레이블 컴포넌트 생성

JLabel textLabel = new JLable("사랑합니다");

이미지를 가진 레이블 컴포넌트 생성

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

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

  • sunset.jpg의 경로명이 "images/sunset.jpg"인 경우
imageIcon image = new ImageIcon("images/sunset.jpg");
JLabel imageLabel = newJLabel(image);

수평 정렬 값을 가진 레이블 컴포넌트 생성

텍스트 이미지 모두 출력하고자 하는 경우 수평 정렬 지정

ImageIcon image = new ImageIcon("images/sunset.jpg");
JLabel label = new JLabel("사랑합니다", image, SwingConstants.CENTER);

예제 11-2, JLabel을 이용한 레이블 생성

package experience;

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

public class JLabelEx2 extends JFrame {
    public JLabelEx2(){
        setTitle("레이블 예쩨");
        setSize(600,300);
        setVisible(true);
        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);


    }

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

버튼 컴포넌트

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

생성자

JButton() // 빈버튼
JButton(Icon image) //이미지 버튼
JButton(String text) //문자열 버튼
JButton(String text, Icon image) // 문자열과 이미지를 가진 버튼

버튼 컴포넌트 생성 예

  • "hello" 문자열을 가진 버튼 컴포넌트 생성 예
    JButton btn = new JButton("hello");

이미지 버튼 만들기


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

  • 마우스 접근에 따라 서로 다른 3 개의 이미지 출력 가능
  • 사용자의 버튼 조작에 대한 시각적 효과를 극대화

3개의 버튼 이미지

  1. 버튼의 보통 상태 때 출력되는 이미지
    • 생성자에 이미지 아이콘 전달
    • 이미지 설정 메소드 : JButton의 setIcon(Icon image)
  2. 버튼에 마우스가 올라갈 때 출력되는 이미지
    • 이미지 설정 메소드 : JButton.setRolloverIcon(Icon);
  3. 버튼을 누르고 있는 동안 출력되는 이미지
    - 이미지 설정 메소드 : JButton.setPressed(Icon)

이미지 아이콘 생성

new ImageIcon(이미지 경로명);

  • 예) new ImageIcon("images / normallcon.gif);

예제 11-3 : JButton 을 이용한 버튼 만들기

package experience;

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

public class ButtonEx extends JFrame {
    public ButtonEx() {
        setTitle("이미지 버튼 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        ImageIcon normalIcon = new ImageIcon("image/~~.gif"); //이미지경로
        ImageIcon rolloverIcon = new ImageIcon("image/~~.gif"); //이미지경로
        ImageIcon pressedIcon = new ImageIcon("image/~~.gif"); //이미지경로

        JButton btn = new JButton("call~~", normalIcon);
        btn.setPressedIcon(pressedIcon);
        btn.setRolloverIcon(rolloverIcon);

        c.add(btn);
        setSize(250, 150);
        setVisible(true);

    }

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

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


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

void setHorizontalAlignment (int align)
  • align : 정렬의 기준을 지정하는 값으로 다음과 같다.
SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT

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

 void setVerticalAligment(int align)
  • align : 정렬의 기준을 지정하는 값으로 다음과 같다.
SwingConstants.TOP, SwingConstants.CENTER, SwingConstants.BoTTOM
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글