본문 바로가기
Programming/JAVA

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

by 안녕주 2020. 12. 30.

명품자바프로그래밍 chapter11_lab10

실습1| font 설정 프로그램

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


public class FontTest extends JFrame{
   JRadioButton rbgul,rbdot,rbgung; //폰트 설정하는 JRadioButton
   JCheckBox cbBold,cbItalic; //Style 설정하는 JCheckBox
   private String [] sizelist = {"5","10","15","20","25","30"}; //사이즈 리스트 고정으로 만듬 임의로 
   JComboBox<String> sizeCombo = new JComboBox<String>(sizelist); //Size설정하는 콤보박스
   
   JTextField tfText = new JTextField(15); //내용입력하는  텍스트필드
   JLabel result = new JLabel(); //결과값 출력하는 부분
   int size; 
   
   public FontTest() {
      setTitle("Font 설정");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Container c = getContentPane();
      c.setLayout(new BorderLayout(10,10));  //BorderLayout 사용!
      MyListener ml = new MyListener(); 
      
      JPanel panelLeft = new JPanel(); //왼쪽에
      panelLeft.setLayout(new GridLayout(4,1,2,2)); //그리드 레이아웃으로 4행 1열 맞추기
      panelLeft.add(new JLabel("Font 설정"));
      panelLeft.add(new JLabel("Style 설정"));
      panelLeft.add(new JLabel("Size 설정"));
      panelLeft.add(new JLabel("Text 내용"));
      c.add(panelLeft, BorderLayout.WEST); //서쪽에 보더레이아웃 추가
      
      
      JPanel panelCenter = new JPanel(); //센터에 들어갈 목록들 4가지 (Font, Style, Size, text)
      panelCenter.setLayout(new GridLayout(0,1));
      
      JPanel panelFont = new JPanel(); //1. Font설정
      ButtonGroup Font = new ButtonGroup(); //버튼 그룹으로 묶어줘야지 라디오 버튼, 1개만 택할수 있도록 할 수 있음
      rbgul = new JRadioButton("굴림");
      rbgul.addItemListener(ml);
      rbdot = new JRadioButton("돋움", true); //돋움을 스타트 값(세팅값)으로 고정(?)
      rbdot.addItemListener(ml);
      rbgung = new JRadioButton("궁서");
      rbgung.addItemListener(ml);
      Font.add(rbgul);Font.add(rbdot);Font.add(rbgung); //버튼그룹에 각 필드들 추가
      panelFont.add(rbgul);panelFont.add(rbdot);panelFont.add(rbgung); //Font를 구성하는 패널에 추가
      panelCenter.add(panelFont); //위치를 지정해주는 Center 패널에 panelfont 추가
      
      JPanel panelStyle = new JPanel(); //2. Style 설정
      cbBold = new JCheckBox("BOLD");
      cbBold.addItemListener(ml); //이벤트 추가
      cbItalic = new JCheckBox("ITALIC");
      cbItalic.addItemListener(ml); //이벤트 추가
      panelStyle.add(cbBold);  panelStyle.add(cbItalic); //두개의 필드를 panelStyle 패널에 추가
      panelCenter.add(panelStyle); //위치를 지정해주는 Center 패널에 추가
      
      JPanel panelsize = new JPanel(); //Size 내용
      panelsize.add(sizeCombo); //size관련 내용을 구성하는 패널에 추가
      panelCenter.add(sizeCombo); //위치지정해주는 패널에 추가
      
      JPanel panelText = new JPanel(); //Text 내용
      panelText.add(tfText); //text관련 내용을 구성하는 패널에 추가
      panelCenter.add(panelText); //위치지정해주는 패널에 추가
      
      c.add(panelCenter, BorderLayout.CENTER); //Center에 들어가는 panelCenter를 Center에 추가
       
      //size에 대한 이벤트 --> Font.PLAIN 이 오류가 떠서 따로 이벤트 클래스 작성
      sizeCombo.addActionListener(new MyActionListener());
      
      tfText.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            result.setText(tfText.getText()); //사용자가 입력한 문자열로 setText
         }
      });
      
      
      JPanel panelBottom = new JPanel(); //출력 결과를 보여주는 패널
      Border resultBorder = BorderFactory.createTitledBorder("Font 설정 결과"); //테두리 설정
      Border resultBorderLine = BorderFactory.createLineBorder(Color.CYAN); //테두리 색 설정
      panelBottom.setBorder(resultBorder); //테두리
      panelBottom.add(result); 
      c.add(panelBottom, BorderLayout.SOUTH); //아래쪽에 추가
      
      
      setSize(300,300); 
      setVisible(true);
   }
   
   class MyActionListener implements ActionListener{
	@Override
	public void actionPerformed(ActionEvent e) {
		JComboBox<String> cb = (JComboBox<String>)e.getSource();
        int index = cb.getSelectedIndex(); //인덱스를 받아와서
        String s = sizelist[index]; //해당 리스트의 인덱스 값에 해당하는 String 받아와서
        size = Integer.parseInt(s); //입력받은 값을 정수로 변환
        result.setFont(new Font("돋움체",Font.PLAIN,size)); //폰트 설정 (돋움을 기본 세팅 값으로 할거기 때문에 임의로 돋움체로 설정)
        result.setText(tfText.getText()); //결과 텍스트 변경
	}
   }
   
   class MyListener implements ItemListener{
      @Override
      public void itemStateChanged(ItemEvent e) {
    	  int index = sizeCombo.getSelectedIndex();
          String s = sizelist[index];
          size = Integer.parseInt(s);
         
         if (rbgul.isSelected()) { //굴림체를 골랐을 경우
            result.setFont(new Font("굴림체",Font.PLAIN,size)); //해당 내용으로 폰트 설정
            result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            if (cbBold.isSelected()) { //Bold를 골랐을 경우
               result.setFont(new Font("굴림체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected()) { //Italic을 골랐을 경우
               result.setFont(new Font("굴림체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected() && cbBold.isSelected()){ //Bold와 Italic 둘다 골랐을 경우
            	result.setFont(new Font("굴림체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
                result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
         }
         
         
         if (rbdot.isSelected()) { //돋움체를 골랐을 경우
            result.setFont(new Font("돋움체",Font.PLAIN,size));//해당 내용으로 폰트 설정
            result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            if (cbBold.isSelected()) { //Bold를 골랐을 경우
               result.setFont(new Font("돋움체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected()) { //Italic을 골랐을 경우
               result.setFont(new Font("돋움체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected() && cbBold.isSelected()){ //Bold와 Italic 둘다 골랐을 경우
            	result.setFont(new Font("돋움체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
                result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            
         }
         
         
         if (rbgung.isSelected()) { //궁서체를 골랐을 경우
            result.setFont(new Font("궁서체",Font.PLAIN,size)); //해당 내용으로 폰트 설정
            result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            if (cbBold.isSelected()) { //Bold를 골랐을 경우
               result.setFont(new Font("궁서체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected()){ //Italic을 골랐을 경우
               result.setFont(new Font("궁서체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if(cbItalic.isSelected() && cbBold.isSelected()){ //Bold와 Italic 둘다 골랐을 경우
            	result.setFont(new Font("궁서체",Font.ITALIC +Font.BOLD,size));//해당 내용으로 폰트 설정
                result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
         }
         
         if (cbBold.isSelected()) { //Bold를 골랐을 경우
            result.setFont(new Font("돋움체",Font.BOLD,size)); //해당 내용으로 폰트 설정
            result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            if (rbgul.isSelected()) { //굴림을 골랐을 경우
               result.setFont(new Font("굴림체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if (rbdot.isSelected()) { //돋움을 골랐을 경우
               result.setFont(new Font("돋움체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if (rbgung.isSelected()) { //궁서를 골랐을경우
               result.setFont(new Font("궁서체",Font.BOLD,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }            
         }
         
         if (cbItalic.isSelected()) { //Italic을 골랐을 경우
            result.setFont(new Font("돋움체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
            result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            
            if (rbgul.isSelected()) { //굴림을 골랐을 경우
               result.setFont(new Font("굴림체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            if (rbdot.isSelected()) { //돋움을 골랐을 경우
               result.setFont(new Font("돋움체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
            
            if (rbgung.isSelected()) { //궁서를 골랐을경우
               result.setFont(new Font("궁서체",Font.ITALIC,size)); //해당 내용으로 폰트 설정
               result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
            }
         }
         
         if(cbItalic.isSelected() && cbBold.isSelected()){ //Bold와 Italic 둘다 골랐을 경우
         	result.setFont(new Font("돋움체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
             result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
             if (rbgul.isSelected()) { //굴림을 골랐을 경우
                 result.setFont(new Font("굴림체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
                 result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
              }
              if (rbdot.isSelected()) {//돋움을 골랐을 경우
                 result.setFont(new Font("돋움체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
                 result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
              }
              
              if (rbgung.isSelected()) { //궁서를 골랐을경우
                 result.setFont(new Font("궁서체",Font.ITALIC +Font.BOLD,size)); //해당 내용으로 폰트 설정
                 result.setText(tfText.getText()); //결과 텍스트 내용 세팅 
              }
         }
         
      }
   }
   
   public static void main(String[] args) {
      new FontTest();
   }
}

 

실습2| 리스트 추가 및 삭제

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.event.*;
import java.util.Vector;
import java.awt.*;

public class ListTest extends JFrame{
	JTextField tf = new JTextField(27); //입력
	JTextField text = new JTextField(14);; //출력
	JButton b_modify,b_delete; //JButton 
	Vector<String> v = new Vector<String>(); //vector 선언
	JList<String>list = new JList<String>(v); //리스트 선언
	
	public ListTest() {
		setTitle("리스트 테스트");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());	 //Flow 레이아웃 설정
		ListListener ll = new ListListener();
		
		c.add(tf); //List입력받는 곳 --> enter로 추가

		tf.addActionListener(new ActionListener() { //JTextfield에 ActionListener 등록 
			public void actionPerformed(ActionEvent e) {
				JTextField t = (JTextField)e.getSource(); //입력받은 내용을 
				v.add(t.getText()); //벡터에 추가
				tf.setText("");//입력하는 창을 초기화
				list.setListData(v); //List에 v 추가
			}
		});
		list.setVisibleRowCount(7); //보여지는 행 5줄
		list.setFixedCellWidth(300); //너비  300
		c.add(new JScrollPane(list)); //패널에 JScrolPane 추가
		
		//이벤트 헨들러 추가
		list.addListSelectionListener(ll); 
		
		
		JPanel pb = new JPanel();
		pb.add(text); //선택했을 때 보여주는 텍스트창
		b_modify = new JButton("수정");
		b_delete = new JButton("삭제");
		b_modify.addActionListener(new MyActionListener()); //이벤트 추가
		b_delete.addActionListener(new MyActionListener()); //이벤트 추가
		
		pb.add(b_modify); pb.add(b_delete); //패널에 추가
		c.add(pb); //컨테이너에 추가
		
		
		setSize(350,250);
		setVisible(true); 
	}
	
	class ListListener implements ListSelectionListener{
		@Override
		public void valueChanged(ListSelectionEvent e) {
			String name = (String)list.getSelectedValue(); //목록에서 선택된 값
			int index = list.getSelectedIndex();  //목록에서 선택된 값의 인덱스
			
			if(!list.isSelectionEmpty())  //빈 리스트가 아니라면
				text.setText(name); //text에 선택된 목록값 설정.		
		}		
	}
	
	class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			JButton jb = (JButton)e.getSource(); //버튼으로부터 받은 값
			
			int index = list.getSelectedIndex(); //목록에서 선택된 값의 인덱스
			
			if(jb.getText().equals("수정")) { //수정 버튼을 눌렀을 때 
				String x = text.getText(); //수정된 텍스트를 x에 저장
				if(!list.isSelectionEmpty()) { //빈 리스트에서 작업하는게 아니라면
					v.remove(index); //원래 내용을 벡터에서 삭제
					v.add(index,x);  //수정한 내용을 해당 위치에 새로 추가
					text.setText(""); //텍스트창 초기화
					list.setListData(v); //리스트에 덮어쓰기
				}
			}
			
			if (jb.getText().equals("삭제")) {    //삭제 버튼을 눌렀을 때
				if(index != -1) { //빈 list가 아니라면
					v.remove(index); //원래 내용을 벡터에서 삭제
					text.setText(""); //텍스트창 초기화
					list.setListData(v); //덮어쓰기
				}
			}
		}
	}

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

실습3| 슬라이더

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.BadLocationException;

import java.awt.event.*;

public class SliderTest extends JFrame{
	JTextArea ta = new JTextArea(5,20); //textarea선언
	JSlider slider; //JSlider 선언
	
	public SliderTest(){
		setTitle("TextArea Practice Frame");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout()); //FlowLayout
		c.add(ta); //textarea는 먼저 컨테이너에 추가
		ta.addKeyListener(new MyKeyListener()); //이벤트 추가
		
		
		slider = new JSlider(JSlider.HORIZONTAL,0,100,0); //JSLider 생성 0~100까지의 값
		slider.setPaintLabels(true); //라벨이 보이게
		slider.setPaintTicks(true);
		slider.setPaintTrack(true); 
		slider.setMajorTickSpacing(20); //간격
		slider.setMinorTickSpacing(10); //작은 눈금 간격
		c.add(slider); //컨테이너에 추가
		slider.addChangeListener(new MyChangeListener()); //이벤트 추가
		
		setSize(300,200);
		setVisible(true);
	}
	
	class MyChangeListener implements ChangeListener{ //사용자가 손잡이를 움직이는 경우
		@Override
		public void stateChanged(ChangeEvent e) {
			JSlider slider = (JSlider)e.getSource();
			int x = slider.getValue(); //손잡이 위치값 바뀐거 x에 저장
			
			if(ta.getText().length() > x) {  //슬라이더를 움직여서, 글자의 수가 슬라이더의 값보다 크다면 
				try {
					ta.setText(ta.getText(0,x)); //글자 삭제
				} catch (BadLocationException e1) {
					e1.printStackTrace();
				}
			}
		}	
	}
	
	class MyKeyListener extends KeyAdapter{  //키보드에서의 이벤트
		@Override
		public void keyTyped(KeyEvent e) {
			JTextArea ta= (JTextArea)e.getSource(); 					
			if (ta.getText().length() >100) //100을 못넘어 가도록, 텍스트 값이 100을 넘어가면
				try {
					ta.setText(ta.getText(0,100)); //글자수 제한
				} catch (BadLocationException e1) {
					e1.printStackTrace();
				}	
			else { //안넘어 가면 
				slider.setValue(ta.getText().length()); //슬라이더의 값은 텍스트의 길이만큼
				slider.addChangeListener(new MyChangeListener()); //그 이외 이벤트 다시 실행
			}
		}
	}

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

'Programming > JAVA' 카테고리의 다른 글

스레드와 멀티태스킹, 고급 스윙 컴포넌트  (0) 2020.12.30
그래픽  (0) 2020.12.30
자바의 이벤트 처리  (0) 2020.12.30
자바 GUI 기초, AWT와 스윙  (0) 2020.12.30
자바 기말 플젝 코드(미완성)  (0) 2020.12.30

댓글