---------학교에서 배운 내용(개인적으로 공부한 내용), 여기서부터 이해가 필요한거 같아서 정리해서 올립니다---------
---------아직 실력이 부족해서 예제는 다 못풀어서 일단 풀 수 있는 문제만 풀었습니다.---------
<<<<<<<<<<<<<<JAVA의 기본적인 스윙컴포넌트와 활용>>>>>>>>>>>>>>>>>>>>>
GUI 프로그래밍
- 컴포넌트 기반 : 스윙 패키지에 주어진 GUI 컴포넌트 이용하며 구성이 쉽다. 일반적인 GUI 프로그램에 적합하며 자바 패키지에 제공하는 GUI 컴포넌트 한계가 있다.
- 그래픽 기반 (명품자바 12장) : 선, 원, 도형, 이미지를 직접 그리는 그래픽 화면 구성. 개발자의 작업 부담이 높으며 자바 패키지에 없는 독특한 GUI 구성 가능. 게임 등 자유로운 GUI
<<스윙 컴포넌트와 상속 관계>>
스윙 컴포넌트 의 공통 메소드, JComponent는 컴포넌트의 모양, 상태, 위치, 크기에 관련된 메소드와 컨테이너를 위한 메소드가 있다.
JLabel : 문자열이나 이미지를 컴포넌트화해 출력해줌
JButton 과 JLabel 은 윈도우의 컴포넌트이다.
JButton : 이름 그대로 버튼으로, 레이블처럼 JFrame에 붙여서 사용
JCheckBox : 선택, 비선택 두 가지 상태를 가지는 버튼
JRadioButton : 사용자가 여러 개의 선택지 중에 1개의 선택지만 선택할 수 있는 버튼
- 라디오버튼 : 하나만 선택. 반드시 논리적 버튼그룹 객체가 필요하다.
라디오 버튼은 하나를 선택하면 기존에 선택된 버튼이 선택 해제가 되기 때문에, 사용자가 잘못된 여러 개의 옵션을 선택하지 못하도록 방지해주는 역할을 한다.
라디오 버튼은 옵션이 숨겨져 있는 드롭다운 메뉴과 달리 옵션들이 밖으로 나와있기 때문에, 사용자가 불필요한 테스크를 수행하지 않도록 도와줄 수 있다.
- 체크박스 : 다중 선택
체크 박스(check box)는 컴퓨팅에서 그래픽 사용자 인터페이스 요소 위젯의 하나이다. 사용자가 수많은 선택 사항에서 여러 개를 선택할 수 있게 한다.
JSlider : 마우스로 움직이면서 값을 선택하는 컴포넌트
JTextField : 한줄의 문자열을 입력받는 창
- 텍스트 입력 도중 <ENTER> 키가 입력되면 Action 이벤트 발생
- 입력 가능한 문자 개수와 입력 창의 크기는 서로 다름
JTextArea :여러 줄의 문자열을 입력받을 수 있는 창
- 스크롤바를 지원하지 않는다.
- JScrollPane 객체를 삽입하여 스크롤바 지원
JList<E> : AWT의 List와 비슷한 기능을 제공,
- JList클래스는 모델 클래스를 직접 설계하지 않더라도 기본적으로 DefaultListModel를 제공하므로 리스트 객체를 생성한다.
JComboBox<E> : 여러항목을 보여주고, 선택을 하도록 한다는 점에서는 JList와 같다
- 처음에는 기본항목만 보이고 클릭하면 여러항목이 나타난다.
- ItemSelectable은 항목선택이 가능하도록 해주는 인터페이스
- ListDataListenner는 기본항목을 선택된 항목으로 바꿀 때 필요하다.
- Accessible은 위젯의 위치로 작동에 관한 인터페이스.
생성자함수
JComboBox() - 기본생성자
JComboBox()(Object[] items) - 특정 배열을 항목으로 하는 콤보박스 생성
JComboBox()(Vector<?>items) - 특정 벡터를 항목으로 하는 콤보박스 생성
메소드
void addItem(Object o) - 아이템 항목을 추가할 때 사용
void removeltem(Object o) - 아이템 항목을 제거할 때 사용
void removeAllItems() - 모든 항목을 제거할 때 사용
void serEditable(boolean b) - 편집기능 여부
void actionListener(ActionListener a) - 액션 리스너 붙이기
void addItemListener(ItemListener i) - 아이템 리스너 붙이기
E getItemAt(int index) - 특정 인덱스에 있는 아이템 항목 반환,
int getSeleCtedindex() - 선택 항목의 인텍스를 반환
메뉴 만드는 과정 : JMenuBar->JMenu컴포넌트->JMenuItem->JMenuBar컴포넌트를 JFrame 에 붙인다.
팝업 다이얼로그 : JAVA스윙에서 이미 구현해놓은 간단한 팝업창으로 사용자에게 메시지를 전달하거나 간단한 문자열을 입력받을 수 있는 유용한 다이얼로그
입력 다이얼로그 : 사용자에게 보여주고자 하는 내용을 출력하고 사용자로부터 입력을 받는 대화상자이다. -다른컨테이너에 속할 필요없이 화면에 출력가능
예제 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-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 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-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;
}
}
}
}
'명품자바프로그래밍' 카테고리의 다른 글
명품 JAVA programming 10장 (0) | 2021.09.29 |
---|---|
명품 JAVA programming 9장 (0) | 2021.09.29 |
명품 JAVA programming 7장 (0) | 2021.09.28 |
명품 JAVA programming 6장 (0) | 2021.09.28 |
명품 JAVA programming 5장 (0) | 2021.09.28 |