728x90
728x90

 

명품자바프로그래밍 11장. 기본적인 스윙 컴포넌트와 활용

명품자바프로그래밍 11장 요약

 

GUI 프로그래밍

- 컴포넌트 기반 : 스윙 패키지에 주어진 GUI 컴포넌트 이용하며 구성이 쉽다. 일반적인 GUI 프로그램에 적합하며 자바 패키지에 제공하는 GUI 컴포넌트 한계가 있다.

- 그래픽 기반 (명품자바 12장) : 선, 원, 도형, 이미지를 직접 그리는 그래픽 화면 구성. 개발자의 작업 부담이 높으며 자바 패키지에 없는 독특한 GUI 구성 가능. 게임 등 자유로운 GUI

 

스윙 컴포넌트와 상속 관계

 

스윙 컴포넌트 의 공통 메소드, JComponent는 컴포넌트의 모양, 상태, 위치, 크기에 관련된 메소드와 컨테이너를 위한 메소드가 있다.

 

JLabel : 문자열이나 이미지를 컴포넌트화해 출력해줌

- 생성자;

JButton :

JCheckBox :

JRadioButton :

- 라디오버튼 : 하나만 선택. 반드시 논리적 버튼그룹 객체가 필요하다.

- 체크박스 : 다중 선택

JTextField

JTextArea

JList<E>

JComboBox<E>

JSlider : 마우스로 움직이면서 값을 선택하는 컴포넌트

메뉴 만드는 과정 : JMenuBar->JMenu컴포넌트->JMenuItem->JMenuBar컴포넌트를 JFrame 에 붙인다.

팝업 다이얼로그

입력 다이얼로그

확인 다이얼로그

 

 

명품자바프로그래밍 11장 예제

 

| 예제 11-1 |

| 예제 11-2 |

 

| 예제 11-3 | 각 이미지 파일로부터 normalIcon, rolloverIcon, pressedIcon을 각각 생성하고 JButton에 등록하여 다음과 같이 작동하는 버튼을 작성하라. 이미지 파일은 프로젝트 폴더 밑의 images 폴더에 있어야 한다.

 

| 예제 11-4 |  문자열 체크박스 2개와 이미지 체크박스 1개를 가진 프로그램을 작성하라. 이미지 체크박스에는 선택 상태를 나타내는 이미지를 지정하여야 한다.

package test11;

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CheckBoxTest extends JFrame{
	CheckBoxTest(){
		setTitle("CheckBox");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		JPanel p=new JPanel();
		ImageIcon checked=new ImageIcon("images/rpgiab_icon_pack/32x32/star.png");
		ImageIcon nonchecked=new ImageIcon("images/rpgiab_icon_pack/32x32/wizard.png");
			
		JCheckBox apple=new JCheckBox("머글");
		JCheckBox pear=new JCheckBox("마법사", true);
		JCheckBox cherry=new JCheckBox("뾰로롱", nonchecked);
		cherry.setBorderPainted(true);
		cherry.setSelectedIcon(checked);  //선택이 되었을 때
		
		p.add(apple); p.add(pear); p.add(cherry);
		add(p);
		setVisible(true);
	}
	public static void main(String[] args) {
		new CheckBoxTest();
	}
}

 

 

 

| 예제 11-5 |  다음 그림과 같이 세 과일에 대해 각각 체크박스를 만들고, 사용자가 과일을 선택하거나 해제하면 바로 선택된 과일의 합산을 보여주는 응용프로그램을 작성하라.

package test11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ItemEventTest extends JFrame {
	private JCheckBox[] fruits;
	private String[] names = { "사과", "배", "체리" };
	private JLabel sumLa;

	ItemEventTest() {
		setTitle("11-5");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		JPanel p = new JPanel();    //안묶어주면 오류가 많다.

		fruits = new JCheckBox[3];
		MyItemListener l = new MyItemListener();
		for (int i = 0; i < fruits.length; i++) {
			fruits[i] = new JCheckBox(names[i]);
			fruits[i].addItemListener(l);
			p.add(fruits[i]);

		}
		sumLa = new JLabel("현재 금액은 0원입니다");
		c.add(new JLabel("사과 100원 배 500원 체리 20000원"));
		c.add(p);
		c.add(sumLa);
		setVisible(true);

	}

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

	}

	class MyItemListener 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;
				}
		}
		sumLa.setText("현재 금액은 "+sum+"입니다");
		}
	}
}

 

 

 

| 예제 11-6 | 문자열 라디오버튼 2개와 이미지 라디오버튼 1개를 가진 응용프로그램을 작성하라.

 

 

| 예제 11-7 | 3개의 라디오버튼을 생성하고 각 라디오버튼이 선택될 때 해당 이미지를 출력하는 응용프로그램을 작성하라. 3개의 라디오버튼을 만들고 동일한 버튼 그룹에 삽입, 그중 한 라디오버튼을 초기에 선택 상태로 만든다. JPanel 객체를 하나 생성하고 그 곳에 3개의 라디오버튼을 붙이고, JPanel 객체를 컨텐트팬의 NORTH에 배치한다. 이미지는 JLabel을 통해 출력하며 컨텐트팬의 CENTER에 배치한다.

package test11;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class RadioButtonEx extends JFrame {
	JRadioButton[] rb = new JRadioButton[3];
	ImageIcon[] icon = { new ImageIcon("images/rpgiab_icon_pack/32x32/star.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/puzzle.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/palette.png") };
	String[] str = { "별", "퍼즐", "빠레뜨" };
	JLabel imgLa;

	RadioButtonEx() {
		setTitle("예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JPanel p = new JPanel();
		p.setBackground(Color.GRAY);
		
		ButtonGroup g = new ButtonGroup();
		MyItemListener l = new MyItemListener();
		imgLa = new JLabel(icon[0]);
		
		for (int i = 0; i < rb.length; i++) {
			rb[i] = new JRadioButton(str[i]);
			rb[i].addItemListener(l);
			g.add(rb[i]);
			p.add(rb[i]);
		}
		rb[0].setSelected(true);
	
		add(p, BorderLayout.NORTH);
		add(imgLa);

		setVisible(true);
		
	}

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

	class MyItemListener implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			// TODO Auto-generated method stub
			if (e.getStateChange() == ItemEvent.DESELECTED) // 미선택
				return;
			if (rb[0].isSelected()) {
				imgLa.setIcon(icon[0]);
			} else if (rb[1].isSelected()) {
				imgLa.setIcon(icon[1]);
			} else {
				imgLa.setIcon(icon[2]);
			}
		}
	}
	class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String str=e.getActionCommand();
			if(str.equals("추가")) {	
			}else if(str.equals("취소")){
			}	
		}
	}
}

 

 

 

| 예제 11-8 | JTextField를 이용하여 그림과 같이 이름, 학과, 주소를 입력받는 폼을 만들어라. 입력 창의 열의 개수는 모두 20으로 한다.

package test11;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class p1108 extends JFrame{
	p1108(){
		setTitle("11-08");
		setSize(300, 200);
		setDefaultCloseOperation(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));
	
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new p1108();
	}
}

 

 

 

| 예제 11-9 |

그림과 같이 사용자가 텍스트필드 창에 문자열을 입력한 후 <Enter>키를 입력하면 텍스트영역 창에 문자열을 추가하고 텍스트필드 창에 입력된 문자열을 지우는 프로그램을 작성하라.

 

| 예제 11-10 | 다음 그림과 같이 3개의 리스트를 가진 프로그램을 작성하라. 마지막 리스트는 JScrollPane을 이용하여 스크롤되도록 하라.

 

 

 

| 예제 11-11 |

 

| 예제 11-12 |

 

| 예제 11-13 |

package test11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ComboTest extends JFrame{
	String[] str= {"1번마", "2번마", "3번마"};
	ImageIcon[] imgs= {
			new ImageIcon("images/rpgiab_icon_pack/32x32/star.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/light.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/weather_sun.png")};
	
	JLabel la=new JLabel();

	ComboTest(){
		setTitle("ComboTest");
		setSize(300, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JComboBox<String> combo=new JComboBox<String>(str);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		la.setIcon(imgs[0]);
		c.add(combo);
		c.add(la);
		
		setVisible(true);
		combo.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				int index=combo.getSelectedIndex();
				la.setIcon(imgs[index]);
			}
		});
	}

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

 

 

 

| 예제 11-14 | 다음과 같이 0과 200사이의 값을 선택할 수 있는 수평 슬라이더를 만들어라.

 

| 예제 11-15 | 다음 그림과 같이 JSlider를 이용하여 3개의 슬라이더를 만들고, 각 슬라이더는 색의 구성 요소인 r(red), g(green), b(blue) 값을 선택하는데 사용하라. 사용자가 선택한 r,g,b 값을 조합하여 레이블의 배경색으로 출력하라.

package test0507;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
	
public class SliderTest extends JFrame{
	private JLabel colorLabel;
	private JSlider[] sl=new JSlider[3];

	SliderTest(){
		setTitle("11-15");
		setSize(300, 250);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		colorLabel=new JLabel("슬라이드 테스트");
		colorLabel.setOpaque(true);
		
		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]);
		}
		c.add(colorLabel);
		
		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.setBackground(new Color(r,g,b));
		
		setVisible(true);
	}

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

	}
	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));
			
		}
		
	}

}

 

 

 

| 예제 11-16 | 메뉴를 만들어보자. 그림과 같이 Screen, Edit, Source, Project, Screen, Edit, Source, Project, Run Run의 5개 메뉴를 가지며 Screen 메뉴에만 4개의 메뉴아이템과 분리선 (separator) 을 가지도록 프로그램을 작성하라 .

package test0507;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuTest01 extends JFrame{
	MenuTest01(){
		setTitle("이벤트처리");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JMenuBar mb=new JMenuBar();
		JMenu screenMenu=new JMenu("Screen");
		mb.add(screenMenu);
	
		screenMenu.add(new JMenuItem("Load"));
		screenMenu.add(new JMenuItem("Hide"));
		screenMenu.add(new JMenuItem("ReShow"));
		screenMenu.addSeparator(); //구분선
		screenMenu.add(new JMenuItem("Exit"));
		
		setJMenuBar(mb);
		
		setVisible(true);
	}

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

 

 

 

| 예제 11-17 | 메뉴에 액션 이벤트 달기

package test0507;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuTest01 extends JFrame{
	JLabel imgLa;
	String[] menuStr= {"Load", "Hide", "ReShow", "Exit"};
	JMenuItem[] menuItem=new JMenuItem[4];
	
	MenuTest01(){
		setTitle("이벤트처리");
		setSize(400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JMenuBar mb=new JMenuBar();
		JMenu screenMenu=new JMenu("Screen");
		mb.add(screenMenu);
		imgLa=new JLabel();
		imgLa.setOpaque(true);
		imgLa.setBackground(Color.GRAY);
		
		
		for(int i=0; i<menuItem.length; i++) {
			menuItem[i]=new JMenuItem(menuStr[i]);
			menuItem[i].addActionListener(new MenuActionListener());
			screenMenu.add(menuItem[i]);
			if(i==2) screenMenu.addSeparator();
		}
	
		setJMenuBar(mb);
		add(imgLa);
		setVisible(true);
	}

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

	}
	//event
	class MenuActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String cmd=e.getActionCommand();   //스트림에 따라 명령
			switch(cmd) {
				case "Load":
					if(imgLa.getIcon()!=null)
						return;
						imgLa.setIcon(new ImageIcon("images/aa.jpg"));
						break;
				case "Hide":
					imgLa.setVisible(false);
					break;
				case "Reshow":
					imgLa.setVisible(true);
					break;
				case "Exit":
					System.exit(0);   
					break;
			}
		}	
	}
}

 

 

 

| 예제 11-18 | 메뉴를 만들고 서식, 폰트(굴림, Font.PLAIN.16) , 크기(확대/축소), 색상(빨,파,녹) 으로 구성하라.

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v