티스토리 뷰

PL/JAVA

[JAVA] 자바 - 스윙 컴포넌트

poopooreum 2024. 6. 13. 20:31
반응형

✏️ 스윙 프로그램으로 GUI 화면 구성하기

스윙 프로그램으로 GUI 화면을 구성하는 방법은 2가지이다. 첫 번째는 컴포넌트 기반 GUI 프로그래밍으로 스윙 패키지에 주어진 GUI 컴포넌트를 이용하는 방법으로 쉡게 GUI 프로그램을 작성할 수 있는 방법이 있지만 자바 패키지에서 제공하는 GUI 컴포넌트의 한계를 벗어날 수 없다. 두 번째는 그래픽 기반 GUI 프로그래밍이다. 선, 원 등의 도형과 이미지를 이용하여 그래픽으로 직접 화면에 그리는 방법으로 실행 속도가 빠르고 독특한 GUI를 구성할 수 있지만 프로그래밍에 대한 개발자의 부담이 큰 단점이 있다. 아래 사진은 스윙 컴포넌트의 상속 구조이다.

스윙 컴포넌트와 상속 구조

 

 

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

// 컴포넌트 모양 관련 메소드
void setForeground(Color) // 전경색 설정
void setBackground(Color) // 배경색 설정
void setOpaque(boolean) // 볼투명도 설정
void setFont(Font) // 폰트 설정
Font getFont() // 폰트 리턴

// 컴포넌트 위치와 크기 관련 메소드
int getWidth() // 폭 리턴
int getHeight() // 높이 리턴
int getX() // x 좌표 리턴
int getY() // y 좌표 리턴
Point getLocationOnScreen() // 스크린 좌표상에서의 컴포넌트 좌표
void setLocation(int, int) // 위치 지정
void setSize(int, int) // 크기 지정

// 컴포넌트 상태 관련 메소드
void setEnabled(boolean) // 컴포넌트 활성화 or 컴포넌트 비활성화
void setVisible(boolean) // 컴포넌트 보이기 or 컴포넌트 숨기기
boolean isVisible() // 컴포넌트의 보이는 상태 리턴
 
// 컨테이너 관련 메소드
Component add(Component) // 자식 컴포넌트 추가
void remove(Component) // 자식 컴포넌트 제거
void removeAll() // 모든 자식 컴포넌트 제거
Component[] getComponents() // 자식 컴포넌트 배열 리턴
Container getParent() // 부모 컨테이너 리턴
Container getTopLevelAncestor() // 최상위 부모 컨테이너 리턴

 

스윙 컴포넌트의 메소드 활용하기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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));
        b2.setEnabled(false);
        b3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton)e.getSource();
                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() // 빈 레이블
JLabel(Icon image) // 이미지 레이블
JLabel(String text) // 문자열 레이블
JLabel(String text, Icon image, int hAlign) // 문자열과 이미지를 모두 가진 레이블
// hAlign은 수평 정렬 값으로 SwingConstants.LEFT, SwingConstants.RIGHT, SwingConstants.CENTER 중
// 하나의 값을 가진다.

 

레이블 생성하기

JLabel에 담을 수 있는 이미지는 png, gif, jpg의 세 가지 형식 뿐이다. ※

// 문자열 레이블 생성
JLabel textLabel = new JLabel("Hello");

// 이미지 레이블 생성
ImageIcon image = new ImageIcon("images/image1.jpg");
JLabel ImageLabel = new JLabel(iamge);

// 문자열, 이미지 , 정렬 값을 가진 레이블 생성
ImageIcon image = new ImageIcon("images/image1.jpg");
JLabel ImageLabel = new JLabel("사랑합니다", iamge, SwingConstants.CENTER);

 

JLabel을 이용하여 레이블 생성하기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JLabelEx extends JFrame{
    public JLabelEx(){
        setTitle("레이블 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        // 문자열 레이블 생성
        JLabel textLabel = new JLabel("안녕하세요");

        // 이미지 레이블 생성
        ImageIcon imageIcon = new ImageIcon("images/1.png");
        JLabel imageLabel = new JLabel(imageIcon);

        // 문자열과 이미지를 모두 가진 레이블 생성
        ImageIcon imageIcon1 = new ImageIcon("images/2.png");
        JLabel imageLabel2 = new JLabel("하이요",imageIcon1,SwingConstants.CENTER);

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

        setSize(400,600);
        setVisible(true);
    }

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

 

 

✏️ JButton, 버튼 컴포넌트

JButton버튼 컴포넌트를 만드는 데 이용되고, 버튼을 마우스로 클릭하거나 키로 선택하면 Action 이벤트가 발생한다. 버튼은 아래와 같은 생성자를 이용한다.

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

 

이미지 버튼 만들기

  • normalIcon => 버튼이 보통 상태에 있을 때 출력되는 디폴트 이미지로, 생성자나 JButton의 setIcon(Icon image)을 통해 설정된다.
  • rolloverIcon => 버튼 위에 마우스가 올라갈 때 출력되는 이미지로, JButton의 setRolloverIcon(Icon image)을 호출하여 설정한다.
  • pressedIcon => 버튼이 눌러져 있는 동안 출력되는 이미지로, JButton의 setPressedIcon(Icon image)을 호출하여 설정한다.

JButton을 이용한 버튼 만들기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JButtonEx extends JFrame{
    public JButtonEx(){
        setTitle("이미지 버튼 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        // 3개의 이미지를 파일로부터 읽어옴
        ImageIcon image1 = new ImageIcon("images/네블.jpg");
        ImageIcon image2 = new ImageIcon("images/인스타.jpg");
        ImageIcon image3 = new ImageIcon("images/티스토리.jpg");

        // 3개의 이미지를 가진 버튼 생성
        JButton btn = new JButton("naver",image1);
        btn.setPressedIcon(image2);
        btn.setRolloverIcon(image3);
        c.add(btn);

        setSize(250,150);
        setVisible(true);
    }

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

 

버튼과 레이블의 정렬

// 수평 정렬
void setHorizontalAlignment(int align)
align: SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.RIGHT

// 수직 정렬
void setVerticalAlignment(int algin)
align: SwingConstants.TOP, SwingConstants.CENTER, SwingConstants.BOTTOM

 

 

✏️ JCheckBox, 체크박스 컴포넌트

JCheckBox를 이용하면 선택(selected)과 해제(deselected)의 두 상태만 가지는 체크박스 컴포넌트를 만들 수 있다. 체크박스 컴포넌트는 아래와 같은 생성자를 이용한다.

JCheckBox() // 빈 체크박스
JCheckBox(String text) // 문자열 체크박스
JCheckBox(String text, boolean selected) // 문자열 체크박스
JCheckBox(Icon image) // 이미지 체크박스
JCheckBox(Icon image, boolean selected) // 이미지 체크박스
JCheckBox(String text, Icon image) // 문자열과 이미지를 가진 체크박스
JCheckBox(String text, Icon image, boolean selected) // 문자열과 이미지를 가진 체크박스
//selected: true이면 선택 상태로 초기화, 디폴트는 해제 상태

 

문자열 체크박스 2개와 이미지 체크박스 1개를 가진 예제 만들기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CheckBoxEx extends JFrame{
    public CheckBoxEx(){
        setTitle("체크박스 만들기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        ImageIcon image1 = new ImageIcon("images/네블.jpg"); // 기본 상태 이미지
        ImageIcon image2 = new ImageIcon("images/인스타.jpg"); // 선택 상태 이미지

    JCheckBox check1 = new JCheckBox("이미지1");
    JCheckBox check2 = new JCheckBox("이미지2",true);
    JCheckBox check3 = new JCheckBox("이미지3",image1);

    check3.setBorderPainted(true);
    check3.setSelectedIcon(image2);

    c.add(check1);
    c.add(check2);
    c.add(check3);

    setSize(250,150);
    setVisible(true);
    }

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

 

Item 이벤트 처리하기

Item 이벤트는 체크박스나 라디오버튼의 선택 상태가 바뀔 때 발생하는 이벤트로 이미 선택 상태인 라디오버튼을 누르는 경우 선택 상태에 대한 변화가 없기 때문에 Item 이벤트가 발생하지 않는다.

// 선택 or 해제 행위 자바 코드로 실행하기
JCheckBox c = new JCheckBox("사과");
c.setSelected(true); // 선택 상태로 설정, false이면 해제 상테

// ItemListener 인터페이스
void itemStateChanged(ItemEvent e)
/* Item 이벤트 리스너는 ItemListener 인터페이스를 상속받고 위와 같이 한 개의 메소드이다 */

// ItemEvent 객체
// Item 이벤트가 발생하면 ItemEvent 객체가 생성되어 itemStateChanged()의 인자로 전달된다.
int getStateChange() // 리턴 값은 선택된 경우 ItemEvent.SELECTED, 해제된 경우 ItemEvent.DESELECTED
object getItem() // 이벤트를 발생시킨 아이템 객체 리턴, 체크박스의 경우 JCheckBox 컴포넌트의 레퍼런스 리턴

// 체크박스 컴포넌트에 ItemListener 리스너 달기
checkbox.addItemListener(new MyItemListener());

 

ItemEvent 활용하기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CheckBoxItemEventEx extends JFrame{
    private JCheckBox[] fruits = new JCheckBox[3];
    private String[] names = {"사과","배","체리"};

    private JLabel sumLabel; // 계산 합을 출력할 레이블
    public CheckBoxItemEventEx() {
        setTitle("체크박스와 아이템 이벤트 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        c.add(new JLabel("사과 100원, 배 500원, 체리 20000원"));

        MyItemListenr listener = new MyItemListenr();
        for(int i=0; i<fruits.length;i++){
            fruits[i] = new JCheckBox(names[i]); // names[]의 문자열로 체크박스 생성
            fruits[i].setBorderPainted(true); // 체크박스 외곽선이 보이도록 설정
            c.add(fruits[i]); // 컨텐트팬에 체크박스 삽입
            fruits[i].addItemListener(listener); // 체크박스에 item 리스너 등록
        }

        sumLabel = new JLabel("현재 0원입니다.");
        c.add(sumLabel);

        setSize(250,200);
        setVisible(true);
    }

    class MyItemListenr  implements ItemListener{
        private int sum=0;

        @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange()==ItemEvent.SELECTED){
                if(e.getItem()==fruits[0])
                    sum+=100;
                else if(e.getItem()==fruits[1])
                    sum+=500;
                else
                    sum+=20000;
            }
            else{
                if(e.getItem()==fruits[0])
                    sum-=100;
                else if(e.getItem()==fruits[1])
                    sum-=500;
                else
                    sum-=20000;
            }
            sumLabel.setText("현재 "+sum+"원입니다.");
        }
    }

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

 

 

✏️ JRadioButton, 라디오버튼 컴포넌트

JRadioButton을 이용하면 라디오버튼을 만들 수 있다. 라디오버튼은 생성, 메소드, 이벤트 처리에 있어 체크박스와 동일하지만 버튼 여러 개가 하나의 버튼 그룹을 형성하고, 그룹 내에서 하나만 선택이 가능하다. JRadioButton은 아래와 같은 생성자를 이용한다.

JRadioButton() // 빈 라디오버튼
JRadioButton(Icon image) // 이미지 라디오버튼 
JRadioButton(Icon image, boolean selected) // 이미지 라디오버튼
JRadioButton(String text) // 문자열 라디오버튼
JRadioButton(String text, boolean selected) // 문자열 라디오버튼
JRadioButton(String text, Icon image) // 문자열과 이미지를 가진 라디오버튼
JRadioButton(String text, Icon image, boolean selected) // 문자열과 이미지를 가진 라디오버튼
// selected는 JCheckBox와 동일

 

버튼 그룹과 라디오버튼 생성 과정

// 버튼 그룹 객체 생성
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)

 

문자열 라디오버튼 2개와 이미지 라디오버튼 1개를 가진 예제 만들기

package ex;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JRadioButtonEx extends JFrame {

    public JRadioButtonEx() {
        setTitle("라디오버튼 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        ImageIcon image = new ImageIcon("images/네블.jpg");
        ImageIcon image2 = new ImageIcon("images/인스타.jpg");

        ButtonGroup group = new ButtonGroup();

        JRadioButton apple = new JRadioButton("apple");
        JRadioButton pear = new JRadioButton("pear");
        JRadioButton cherry = new JRadioButton("apple", image);

        cherry.setBorderPainted(true);
        cherry.setSelectedIcon(image2);

        group.add(apple);
        group.add(pear);
        group.add(cherry);

        c.add(apple);
        c.add(pear);
        c.add(cherry);

        setSize(250,150);
        setVisible(true);
    }

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

 

Item 이벤트 처리

라디오 버튼에 선택 상태가 변경되면 Item 이벤트가 발생한다. 마우스와 키보드를 이용하거나
프로그램에서 JRdioButton의 setSelected()를 호출하여 선택 상태를 변경할 수 있다. 이 경우
모두 Item 이벤트가 발생한다. Item 이벤트는 ItemListener 인터페이스의 void itemStateChanged(ItemEvent e) 메소드에 의해 처리된다.

 

 

3개의 라디오버튼 생성 후 각 라디오버튼이 선택될 때 해당 이미지 출력하기

package ex;

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

public class RadioButtonItemEventEx extends JFrame {

    private JRadioButton[] radio = new JRadioButton[3];
    private String[] text = {"네이버 블로그", "티스토리", "인스타그램"};
    private ImageIcon[] image = {
            new ImageIcon("images/네블.jpg"),
            new ImageIcon("images/티스토리.jpg"),
            new ImageIcon("images/인스타.jpg")
    };
    private JLabel imageLabel = new JLabel();

public RadioButtonItemEventEx() {
    setTitle("라디오버튼과 Item 이벤트 활용하기");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    JPanel radioPanel = new JPanel();
    radioPanel.setBackground(Color.GRAY);

    ButtonGroup group = new ButtonGroup();
    for(int i=0;i<radio.length;i++){
        radio[i] = new JRadioButton(text[i]);
        group.add(radio[i]);
        radioPanel.add(radio[i]);
        radio[i].addItemListener(new MyItemListenr());
    }

    radio[2].setSelected(true);
    c.add(radioPanel,BorderLayout.NORTH);
    c.add(imageLabel,BorderLayout.CENTER);
    imageLabel.setHorizontalAlignment(SwingConstants.CENTER);

    setSize(250, 150);
    setVisible(true);
}

class MyItemListenr implements ItemListener {
    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.DESELECTED)
            return;
        if (radio[0].isSelected())
            imageLabel.setIcon(image[0]);
        else if (radio[1].isSelected())
            imageLabel.setIcon(image[1]);
        else
            imageLabel.setIcon(image[2]);
    }
}

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

 

 

✏️ JTextField, 텍스트필드 컴포넌트

JTextField를 이용하면 한 줄의 문자열을 입력받는 창(텍스트필드)을 만들 수 있으며 입력 간으한 문자 개수와 창의 크기는 응용프로그램에서 변경할 수 있다. 텍스트필드 입력 중 <Enter> 키가 입력되면 Action 이벤트가 발생한다. JTextFiled는 아래와 같은 생성자를 사용한다.

JTextField() // 빈 텍스트필드
JTextField(int cols) // 입력 창의 열의 개수가 cols개인 텍스트필드
JTextField(String text) // text 문자열로 초기화된 텍스트필드
JTextField(String text, int cols) // 입력 창의 열의 개수는 cols개이고 text 문자열로 초기화된 텍스트필드

 

간단한 텍스트필드 컴포넌트 만들기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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();
    }
}

 

JTextFiled의 주요 메소드

// 문자열의 편집 불가능하게 하기
JTextField tf = new JTextField();
tr.setEditable(false);// 텍스트필드 창에 입력하거나 수정 불가

// 입력 창에 문자열 출력
tf.setText("안녕하세요!");

// 문자열의 폰트 지정
tf.setFont("고딕체", Font.ITALIC, 20);

 

 

✏️ JTextArea, 텍스트영역 컴포넌트

JTextArea를 이용하면 여러 줄의 문자열을 입력받을 수 있는 창을 만들 수 있고 창의 크기보다 많은 줄과 문자를 입력할 수 있지만 스크롤바를 지원하지 않으므로 JTextArea 컴포넌트를 JScrollPane에 삽입하여야 스크롤바를 지원 받을 수 있다. JTextArea는 아래와 같은 생성자를 사용한다.

JTextArea() // 빈 텍스트 영역
JTextArea(int rows, int cols) // 입력 창이 rows * cols개의 문자 크기인 텍스트영역
JTextArea(String text) // text 문자열로 초기화된 텍스트영역
JTextArea(String text, int rows, int cols) // 입력 창이 rows * cols개의 문자 크기이고 text 문자열로 초기화된 텍스트영역

 

JTextArea 컴포넌트 생성하기

package ex;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class TextAreaEx  extends JFrame{

    private JTextField tf = new JTextField(20);
    private JTextArea ta = new JTextArea(7, 20);

    public TextAreaEx() {
        setTitle("텍스트영역 만들기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        c.add(new JLabel("입력 후 <Enter> 키를 입력하세요!"));
        c.add(tf);
        c.add(ta);

        tf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextField t =(JTextField)e.getSource();
                ta.append(t.getText()+"\n");

                t.setText("");
            }
        });

        setSize(300,300);
        setVisible(true);
    }

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

 

 

✏️ JList<E>, 리스트 컴포넌트

JList<E>는 여러 개의 아이템을 리스트 형식으로 보여주고 아이템을 선택하도록 하는 리스트 컴포넌트를 구현한다. 제네릭 방식을 사용하므로 리스트를 생성할 때 E 대신 아이템 타입을 대입하여 구체화하여야 한다. JTextArea와 마찬가지로 스크롤을 지원하지 않기 때문에 JScrollPane에 삽입되어야 스크롤이 가능하다. JList <E>는 아래와 같은 생성자를 사용한다.

JList<E>() // 빈 리스트
JList<E>(Vector listData) // 벡터로부터 아이템을 공급받는 리스트
JList<E>(Object [] listData) // 배열로부터 아이템을 공급받는 리스트

 

객체 배열로부터 리스트 생성

String [] fruits = {"apple", "banana", "kiwi", "mango"};
JList<String> strList = new JList<String>(fruits);
JscrollPane pane = new JScrollPane(strList);

 

리스트 만들기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ListEx extends JFrame{

    private String[] fruits = {"apple", "banana", "kiwi", "mango", "pear", "peach", "berry", "strawberry", "blackberry"};

    private ImageIcon[] images = {new ImageIcon("images/네블.jpg"),
            new ImageIcon("images/인스타.jpg"),
            new ImageIcon("images/자바.jpg"),
            new ImageIcon("images/티스토리.jpg"),
    };

    public ListEx() {
        setTitle("리스트 만들기 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JList<String> strlist = new JList<>(fruits);
        c.add(strlist);

        JList<ImageIcon> imglist = new JList<>(images);
        imglist.setListData(images);
        c.add(imglist);

        JList<String> scrollList = new JList<>(fruits);
        c.add(new JScrollPane(scrollList));

        setSize(300,300);
        setVisible(true);
    }

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

 

리스트의 아이템 변경

JList<E>는 생성자를 이용하여 일단 생성되고 나면 listData의 벡터나 배열을 수정한다고 해도 이미 생성된 리스트를 변경할 수 없다. 이때 사용할 수 있는 방법이 setListData() 메소드이다.

// setListData() 사용하기
Vector<String> v = new Vector<>();
v.add("Hi");
v.add("Bye");
JList<String> nameList = new JList<Stirng>(v);

// 리스트에 문장 추가하기
v.add("a you");
nameList.setListData(v);
package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class ListChangeEx extends JFrame{
        private JTextField tf = new JTextField(10);
        private Vector<String> v =new Vector<>();
        private JList<String> nameList = new JList<>(v);
    public ListChangeEx() {
        setTitle("리스트 변경 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        c.add(new JLabel("이름 입력 후 <Enter> 키"));
        c.add(tf);

        v.add("홍길동");
        v.add("허난설현");
        nameList.setVisibleRowCount(5); // 리스트가 보여주는 행의 수
        nameList.setFixedCellWidth(100); // 리스트의 폭
        c.add(new JScrollPane(nameList));

        setSize(300,300);
        setVisible(true);

        tf.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextField t= (JTextField)e.getSource();
                v.add(t.getText());
                t.setText("");
                nameList.setListData(v);
            }
        });
    }

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

 

 

✏️ JComboBox<E>, 콤보박스 컴포넌트

JComboBox<E>는 텍스트 필드, 버튼, 드롭다운 리스트로 구성되는 콤보박스 컴포넌트를 구현한다. 제네렉 형식으로 구현되어 있으며 콤보박스를 생성할 때 E 대신 아이템의 타입을 대입하여 구체화해야 한다. JComboBox 컴포넌트의 생성자는 아래와 같다.

JComboBox<E>() // 빈 콤보박스
JComboBox<E>(Vector listData) // 벡터로부터 아이템을 공급받는 콤보박스
JComboBox<E>(Object [] listData) // 배열로부터 아이템을 공급받는 콤보박스
// JList<E>와 같이 한 번 만들어진 콤보박스는 수정할 수 없다

 

콤보박스 생성, 추가, 삭제

// 배열로부터 콤보박스 생성
String [] fruits = {"apple", "banana", "kiwi", "mango", "pear"};
JComboBox<String> strCombo = new JComboBox<>(fruits);

// 콤보박스에 동적으로 아이템 추가
String [] names = {"kitae", "jaemon", "hyso", "daf"};
JComboBox<String> nameCombo = new JComboBox<>(); // 빈 콤보박스 생성
for(int i=0; i<names.length;i++)
     nameCombo.addItem(names[i]);
    
// 콤보박스 컴포넌트의 아이템 삭제
nameCombo.removeItemAt(2); // 3번째 아이템 삭제

 

콤보박스 만들기

package ex;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ComboBoxEx  extends JFrame{
    private String[] fruits = {"apple", "banana", "kiwi", "mango", "pear", "peach", "berry", "strawberry", "blackberry"};
    private String [] names ={"kiet","dfadf","Afdadf","Adfad","zcvzc"};
    public ComboBoxEx() {
        setTitle("콤보박스 만들기");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        
        JComboBox<String> strCombo = new JComboBox<>(fruits);
        c.add(strCombo);
        
        JComboBox<String> nameCombo = new JComboBox<>();
        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();
    }
}

 

JComboBox<E>와 Action 이벤트

int getSelectedInedx() // 선택 상태인 아이템의 인덱스 번호를 리턴
Object getSelectedItem() // 선택 상태인 아이템 객체의 레퍼런스를 리턴

 

Action 이벤트를 이용한 콤보박스

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ComboActionEx extends JFrame {
    private String[] fruits = {"apple", "banana", "text", "mango"};
    private ImageIcon[] images = {
            new ImageIcon("images/네블.jpg"),
            new ImageIcon("images/인스타.jpg"),
            new ImageIcon("images/자바.jpg"),
            new ImageIcon("images/티스토리.jpg")
    };
    private JLabel imgLabel = new JLabel(images[0]);
    private JComboBox<String> strCombo = new JComboBox<>(fruits);
    public ComboActionEx() {
        setTitle("콤보박스 활용 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(strCombo);
        c.add(imgLabel);

        strCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox<String> cb =(JComboBox<String>)e.getSource();
                int index = cb.getSelectedIndex();
                imgLabel.setIcon(images[index]);
            }
        });

        setSize(300,250);
        setVisible(true);
    }

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

 

 

✏️ JSlider, 슬라이더 컴포넌트

JSlider는 슬라이드 바를 출력하여, 마우스로 값을 선택하도록 하는 슬라이더 컴포넌트로 수평 슬라이더와 수직 슬라이더가 있으며 생성 당시 선택하거나 생성 후 변경할 수 있다. 슬라이더의 구성 요소는 아래와 같다

  • 손잡이: 사용자가 값을 선택하기 위해 움직이는 그래픽 심블
  • minimum과 maximum: 사용자가 선택할 수 있는 최솟값과 최댓값
  • orientation: 슬라이더의 방향을 나타내는 값으로 JSlider.HORIZONTAL과 JSlider.VERTICAL이 있다.
  • track: 슬라이더의 트랙 바를 말하는데 보이게 할 수도 있고 보이지 않게 할 수도 있다
  • majorTickSpacing과 minorTickSpacing: 큰 눈금 간격과 작은 눈금의 간격
  • label: 눈금에 새겨진 문자열로 출력 여부는 option이다
  • value: 슬라이더의 값으로 손잡이가 이 값을 가리킨다.

JSlider 컴포넌트 생성

JSlider() // 디폴트 슬라이더 생성
JSlider(int orientation) // orientation 방향의 슬라이더 생성
JSlider(int min, int max, int val) // 최소, 최대, 초깃값을 가진 슬라이더 생성
JSlider(int orientation, int min, int max, int val)

 

 

슬라이더의 모양 제어

void setOrientation(int orientation)
// orientation 값에 따라 슬라이더의 방향을 수평, 수직 모양으로 변경
void setMinimum(int min)
// 슬라이더의 minimum 값을 min 값으로 초기화
void setMaximum(int max)
// 슬라이더의 maxiimum 값을 max 값으로 초기화
void setPaintLabels(boolean b)
// b가 true이면 슬라이더를 보이게 하고, false라면 감춘다
void setPaintTicks(boolean b)
// b가 true라면 슬라이더의 눈금을 보이게 하고, false라면 감춘다
void setPaintTrack(boolean b)
// b가 true라면 트랙을 보이게 하고, false라면 감춘다
void setMinorTickSpacing(int space)
// 슬라이더의 작은 눈금 간격을 space 값으로 설정
void setMajorTickSpacing(int space)
// 슬라이더의 큰 눈금 간격을 space 값으로 설정
int getValue()
// 슬라이더의 손잡이가 가리키는 값을 리턴
void setValue(int n)
// 슬라이더의 값(value)을 n으로 설정

 

슬라이더 컴포넌트 만들고 모양 제어하기

package ex;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SliderEx extends JFrame{
    public SliderEx() {
        setTitle("슬라이더 만들기 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JSlider slider = new JSlider(JSlider.HORIZONTAL,0,200,100);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setPaintTrack(true);
        slider.setMajorTickSpacing(50);
        slider.setMinorTickSpacing(10);
        c.add(slider);

        setSize(300,100);
        setVisible(true);
    }

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

 

JSlider와 Change 이벤트를 활용한 색깔 다루기

package ex;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
public class SliderChangeEx extends JFrame{
    private JLabel colorLabel;
    private JSlider[] sl = new JSlider[3];
    public SliderChangeEx() {
        setTitle("슬라이더와 ChangeEvent 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c =getContentPane();
        c.setLayout(new FlowLayout());

        colorLabel = new JLabel("Slider Example");

        for(int i=0;i<sl.length;i++){
            sl[i] = new JSlider(JSlider.HORIZONTAL, 0, 255, 128);
            sl[i].setPaintLabels(true);
            sl[i].setPaintTicks(true);
            sl[i].setPaintTrack(true);
            sl[i].setMajorTickSpacing(50);
            sl[i].setMinorTickSpacing(10);

            sl[i].addChangeListener(new MyChangeListener());
            c.add(sl[i]);
        }

        sl[0].setForeground(Color.RED);
        sl[1].setForeground(Color.GREEN);
        sl[2].setForeground(Color.BLUE);

        int r = sl[0].getValue();
        int g = sl[1].getValue();
        int b = sl[2].getValue();
        colorLabel.setOpaque(true);
        colorLabel.setBackground(new Color(r,g,b));

        c.add(colorLabel);
        setSize(300,230);
        setVisible(true);
    }
    class MyChangeListener implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent e) {

            int r=sl[0].getValue();
            int g=sl[1].getValue();
            int b=sl[2].getValue();
            colorLabel.setBackground(new Color(r,g,b));
        }
    }

    public static void main(String[] args) {
        new SliderChangeEx();
    }
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함