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

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