티스토리 뷰
✏️ 스윙 프로그램으로 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();
}
}
'PL > JAVA' 카테고리의 다른 글
[JAVA] 자바 - 스레드와 멀티태스킹 (0) | 2024.06.15 |
---|---|
[Java] 자바 - 그래픽 (0) | 2024.06.14 |
[JAVA] 자바 - 이벤트 (0) | 2024.06.12 |
[JAVA] 자바 - GUI 기초(AWT와 스윙) (2) | 2024.06.11 |
[JAVA] 자바 - 입출력 스트림과 파일 입출력 (0) | 2024.06.10 |
- Total
- Today
- Yesterday
- DP
- java
- 세그먼트 트리
- 알고리즘 공부
- html
- 백준
- 자료구조
- 카운팅 정렬
- CSS
- 에라토스테네스의 체
- BFS
- 유클리드 호제법
- DFS
- 스프링 부트 crud 게시판 구현
- 이분 매칭
- 반복문
- 자바스크립트
- 우선순위 큐
- 알고리즘
- 투 포인터
- Do it!
- C++ Stack
- C++
- 백준 풀이
- 스택
- 유니온 파인드
- HTML5
- 자바
- js
- c++ string
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |