ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Swing
    언어/JAVA 2022. 9. 8. 12:14

    - 윈도우 프로그래밍에 필요한 윈도우 구성요소를 보유한 클래스(JFrame)를 상속받은 클래스로 추가기능 탑재 형식의 개발을 진행

    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    class ButtonTest extends JFrame{
    	// 윈도우 최초 화면의 구성은 대부분 생성자 메서드에서 구성
    	ButtonTest(){
    		JButton male = new JButton("남자");
    		JButton female = new JButton("여자");
    		// 생성자에 입력된 텍스트를 한가운데 표시한 버튼을 생성 아직 화면에 버튼이 보이는 상태는 아님. 
    		// 생성만 해서 아직 배치하고나 보여주는 단계는 아님. 버튼 또는 그 외 컨트롤들은 
    		// 윈도우에 배치되고 위치를 잡아 올라가고 윈도우가 회면에 보여질때 같이 표시
    		
    		// 안내문구 표시용 텍스트 도구
    		JLabel label = new JLabel("당신의 성별은?");
    		
    		// 윈도우 위에 생성된 컨트롤 객체 들을 올려놓을수 있게 해주는 객체
    		Container con = getContentPane();
    		// 위도우에 올라갈 컨트롤 들을 담을 바구니 - 담으면 윈도우에 표시될 준비가 완료
    		
    		// 컨테이너에 add 되어지는 순서로 한줄로 화면 구성
    		con.setLayout( new FlowLayout() ); // 줄맞춤 설정
    		
    		// 컨테이너에 생성된 컨트롤을 순서에 맞춰 올려놓으면 화면에 표시될 준비가 완료
    		con.add(label);
    		con.add(male);
    		con.add(female);
    		con.add(new JButton("남자"));
    		con.add(new JButton("여자"));
    		con.add(new JButton("남자"));
    		con.add(new JButton("여자"));
    		
    		setTitle("버튼 테스트");  // 윈도우의 좌측 상단에 표시된 타이틀
    		setSize(300, 200); // 윈도우 크기 설정 : 단위(픽셀)
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		// 현재 윈도우 종료시 프로그램까지 종료 설정
    		
    		setVisible(true);  // 화면에 윈도우를 출현 시키는 메서드
    	}
    }
    
    public class Swing01 {
    	public static void main(String[] args) {
    		new ButtonTest();
    	}
    }

     

    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    class ButtonTest2 extends JFrame{
    	ButtonTest2(){
    		JButton b1 = new JButton("1"); 		JButton b2 = new JButton("2");
    		JButton b3 = new JButton("3"); 		JButton b4 = new JButton("4");
    		JButton b5 = new JButton("5");		JButton b6 = new JButton("6");
    		JButton b7 = new JButton("7");		JButton b8 = new JButton("8");
    		JButton b9 = new JButton("9");		JButton b0 = new JButton("0");
    		JButton b11 = new JButton("+");		JButton b12 = new JButton("-");
    		JButton b13 = new JButton("x");		JButton b14 = new JButton("÷");
    		JButton b15 = new JButton("=");		JButton b16 = new JButton("C");
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(b7); con.add(b8); con.add(b9); con.add(b11);
    		con.add(b4); con.add(b5); con.add(b6); con.add(b12);
    		con.add(b1); con.add(b2); con.add(b3); con.add(b13);
    		con.add(b15); con.add(b0); con.add(b16); con.add(b14);
    		setTitle("버튼 컴퍼넌트 테스트"); 
    		setSize(220, 200); 
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    }
    public class Swing02 {
    	public static void main(String[] args) {
    		new ButtonTest2();
    	}
    }

     

    1. ActionListener를 implements 
    2. 적용할 컨트롤에 addActionListener 메서드로 감시설정
    3. 해당 컨트롤에 이벤트가 발생하면 호출된  ActionPerformed  메스드를 오버라이드 함

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    class ButtonEvent extends JFrame implements ActionListener{
    	JLabel result;
    	ButtonEvent(){
    		JButton male = new JButton("남자");
    		JButton female = new JButton("여자");
    		JLabel label = new JLabel("당신의 성별은 ? ");
    		result = new JLabel("");
    		
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(label);
    		con.add(male);
    		con.add(female);
    		con.add(result);
    		
    		// 이벤트를 설정하고 감시할 리스너를 적용하고자하는 컨트롤에 붙여둠
    		// 해당 컨트롤에 클릭 등의 이벤트가 발생하면 자동으로 actionPerformed 메서드가 호출
    		male.addActionListener(this);
    		female.addActionListener(this);
    		
    		setTitle("버튼 이벤트 테스트");
    		setSize(300,200);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
        
    	// 설정해놓은 컨트롤이 클릭되면 실행될 명령이 입력되는 곳
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// 클릭된 객체가 e 변수에 전달됩니다
    		// 객체의 표시된 값을 아래와 같이 추출할수 있습니다
    		String s = e.getActionCommand();  
    		result.setText(s + "를 선택하셨습니다");
    	}
    }
    
    public class Swing03 {
    	public static void main(String[] args) {
    		new ButtonEvent();
    	}
    }

     

    이미지파일을 아이콘으로 변환하여 사용하게 하는 클래스

    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.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    class JImageTest extends JFrame  implements ActionListener{
    	JLabel result;
    	JImageTest(){
    		// 이미지파일을 아이콘으로 변환하여 사용하게 하는 클래스
    		ImageIcon ii1 = new ImageIcon("images/korea.gif");
    		ImageIcon ii2 = new ImageIcon("images/germany9060.gif");
    		ImageIcon ii3 = new ImageIcon("images/usa9060.gif");
    		
    		// 버튼을 이미지를 이용하여 생성
    		JButton korea = new JButton("대한민국", ii1);
    		JButton germany = new JButton("독일" , ii2);
    		JButton usa = new JButton("미국" , ii3);
    		result = new JLabel("");
    		
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(korea);
    		con.add(germany);
    		con.add(usa);
    		con.add(result);
    		
    		korea.addActionListener(this);
    		germany.addActionListener(this);
    		usa.addActionListener(this);
    		
    		setTitle("이미지 아이콘 실습");
    		setSize(600, 180);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		result.setText(e.getActionCommand() + "를(을) 선택하셨습니다");
    	}
    }
    
    public class Swing04 {
    
    	public static void main(String[] args) {
    		new JImageTest();
    	}
    }

     

    ActionListener를 사용하지 않고 버튼 자체에 존재하는 이벤트 메서드를 사용

    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    class JButtonEvent extends JFrame{
    	JButtonEvent(){
    		ImageIcon korea = new ImageIcon("images/korea1.gif");
    		ImageIcon usa = new ImageIcon("images/usa.gif");
    		ImageIcon germany = new ImageIcon("images/germany.gif");
    		
    		JButton eventButton = new JButton(korea);
    		
    		eventButton.setRolloverIcon(usa);  // 마우스가 올라갔을때
    		eventButton.setPressedIcon(germany);  // 마우스 버튼을 눌렀을때
    		
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(eventButton);
    		setTitle("버튼 자체 이벤트 처리 실습");
    		setSize(500,400);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    }
    public class Swing05 {
    	public static void main(String[] args) {
    		new JButtonEvent();
    	}
    }

     

    배치 관리자

    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    class JFlowLayout extends JFrame{
    	JFlowLayout(){
    		// 배치관리자 없이 버튼을 컨테이너에 무작정 올린 형태
    		/*JButton btn1 = new JButton("버튼1");
    		JButton btn2 = new JButton("버튼2");
    		Container con = getContentPane();
    		con.add(btn1);
    		con.add(btn2);
    		con.add( new JButton("버튼3") );
    		*/
    		
    		Container con = getContentPane();
    		con.setLayout( new FlowLayout( FlowLayout.LEFT , 50, 10) );
    		// 50 : 콘트롤끼리의 가로 방향 간격   10: 컨트롤끼리의 세로방향 간격   
    		// FlowLayout.RIGHT : 정렬 방식
    		
    		for( int i=1; i<=15; i++)
    			con.add( new JButton("버튼" + i) );
    		// 버튼 생성과 동시에 바로 적재. 버튼을 위한 레퍼런스 변수가 없어서 이후 제어는 불가.  
    		// 적재 모습만 보여주기 위한 예제
    		
    		setTitle("배치관리자  실습");
    		setSize(500,400);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    }
    public class Swing06 {
    	public static void main(String[] args) {
    		new JFlowLayout();
    	}
    }

     

    BorderLayout

    import java.awt.BorderLayout;
    import java.awt.Container;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    class JBorderLayout extends JFrame{
    	JBorderLayout(){
    		Container con = getContentPane();
    		con.setLayout( new BorderLayout(10,10) );
    		// 각 지역(동서남북중앙)간의 간격 가로세로 10px 
    		
    		JButton b1 = new JButton("동쪽 버튼");
    		JButton b2 = new JButton("서쪽 버튼");
    		JButton b3 = new JButton("남쪽 버튼");
    		JButton b4 = new JButton("북쪽 버튼");
    		JButton b5 = new JButton("중앙 버튼");
    		
    		con.add( b1, BorderLayout.EAST );
    		con.add( b2, BorderLayout.WEST );
    		con.add( b3, BorderLayout.SOUTH );
    		con.add( b4, BorderLayout.NORTH );
    		con.add( b5, BorderLayout.CENTER);
    		
    	// Center는 정의하지 않으면 자리가 남지만 이외의 영역은 정의하지 않으면 다른 영역으로 포함되어져 표시
    		
    		setSize(500, 400);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    }
    public class Swing07 {
    	public static void main(String[] args) {
    		new JBorderLayout();
    	}
    }

     

    GridLayout

    import java.awt.Container;
    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    class JGridLayout extends JFrame{
    	JGridLayout(){
    		Container con = getContentPane();
    		// 화면의 배치를 행과 열의 갯수로 배치하고 조절
    		con.setLayout(new GridLayout(4,4,20,20));
    		//3행 5열의 가로 세로 간격 20px 씩의 배치
    		
    		for(int i = 1; i<=16; i++) 
    			con.add(new JButton("버튼"+i));
    		
    		setTitle("그리드 레이아웃  실습");
    		setSize(500,300);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    }
    
    public class Swing08 {
    	public static void main(String[] args) {
    		new JGridLayout();
    	}
    }

     

    BorderLayout, GridLayout 둘 다 사용

    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    
    class JPanelTest extends JFrame{
    	JPanelTest(){
    		// 전체 컨테이너는 보더레이아웃으로
    		Container con = getContentPane();
    		con.setLayout(new BorderLayout());
    		
    		// 패널 두개를 생성해서...
    		JPanel jp1 = new JPanel();
    		JPanel jp2 = new JPanel();
    		// 패널 = 새끼 컨테이너
    		jp1.setLayout(new GridLayout(5,1));
    		jp2.setLayout(new GridLayout(4,1));
    		
    		jp1.add(new JButton("JAVA"));
    		jp1.add(new JButton("C++"));
    		jp1.add(new JButton("ASP"));
    		jp1.add(new JButton("JSP"));
    		jp1.add(new JButton("PHP"));
    		
    		jp2.add(new JButton("JAVA"));
    		jp2.add(new JButton("C++"));
    		jp2.add(new JButton("ASP"));
    		jp2.add(new JButton("JSP"));
    		
    		con.add(jp1, BorderLayout.WEST);
    		con.add(jp2, BorderLayout.EAST);
    		
    		setTitle("패널  실습");
    		setSize(500,500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}	
    }
    public class Swing09 {
    	public static void main(String[] args) {
    		new JPanelTest();
    	}
    }

     

     JTextField : 자바  Swing 패키지내에 있는 글자를 타이핑해서 입력할 수 있는 컨트롤

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    
    class JTextFieldTest extends JFrame implements ActionListener{
    	JTextField jtf;   // 선언(생성)
    	
    	JTextFieldTest(){
    		jtf = new JTextField(30);  // 실제 사용
    		
    		// 30글자를 써넣을수 잇는 텍스트 상자를 생성
    		// JTextField 는 사용자가 직접 내용을 타이핑해서 써넣을수도 있고, 
    		// 프로그램이 내용을 채워서 사용자에게 보여줄수도 있음
    		
    		JButton bt1 = new JButton("방갑습니다");
    		JButton bt2 = new JButton("안녕하세요");
    		
    		bt1.addActionListener(this);
    		bt2.addActionListener(this);
    		
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(bt1);
    		con.add(bt2);
    		con.add(jtf);
    		
    		setTitle("텍스트 필드 테스트");
    		setSize(500,100);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		String s = e.getActionCommand();
    		String oldText = jtf.getText();
    		String newText = oldText + s;
    		jtf.setText(newText);
    	}
    }
    
    public class Swing10 {
    
    	public static void main(String[] args) {
    		new JTextFieldTest();
    	}
    }

     

    EX

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    
    // 윈도우에 텍스트필드1  버튼1   버튼2   텍스트필드2  순서로 배치
    // 버튼1의 표면에는 ">" 글자 표시 , 버튼 2의 표면에는 "<" 글자를 표시
    // 버튼 1을 클릭하면 텍스트필드1의 글자가 텍스트필드2로 옮겨지게
    // 버튼 2을 클릭하면 텍스트필드2의 글자가 텍스트필드1로 옮겨지게
    // 글자가 없는 상태에서 버튼을클릭하면  아무일도 안일어나게윈도클래스 이름은   JTextFieldEx 로 제작
    // 윈도우의 가로 세로크기는 적절히 조절
    
    class JTextFieldEx extends JFrame implements ActionListener{
    	// 오버라이드된 actionPerformed에서도 접근하게 하기 위해서 텍스필드 선언은 생성자 밖에서
    	JTextField t1;
    	JTextField t2;
    	JTextFieldEx(){
    		t1 = new JTextField(15);
    		t2 = new JTextField(15);
    		
    		JButton b1 = new JButton(">");
    		JButton b2 = new JButton("<");
    		
    		Container con = getContentPane();
    		con.setLayout(new FlowLayout());
    		con.add(t1);	 
    		con.add(b1);		
    		con.add(b2);		
    		con.add(t2);
    		
    		b1.addActionListener(this);
    		b2.addActionListener(this);
    		
    		setTitle("텍스트 필드 테스트");
    		setSize(600,100);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		String s = e.getActionCommand();
    		if( s.equals(">") ) {
    			if( !(t1.getText().equals("")) ) {
    				String s2 =  t1.getText();
    				t2.setText( s2 );
    				t1.setText("");
    			}
    		}else {
    			if( !(t2.getText().equals("")) ) {
    				t1.setText( t2.getText() );
    				t2.setText("");
    			}
    		}
    	}
    }
    public class Swing11 {
    	public static void main(String[] args) {
    		new JTextFieldEx();
    	}
    }
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    
    //컨테이너의 레이아웃 : 5행 1열의 GridLayout
    //1 행 : JPanel p1 배치 -> p1에는 FlowLayout 으로 TextField 한개 배치(가로크기 적당히)
    //2 행 : JPanel p2 배치 -> p2 에는 GridLayout 으로 버튼 네개( 7, 8, 9, +)
    //3 행 : JPanel p3 배치 -> p3 에는 GridLayout 으로 버튼 네개( 4, 5, 6, -)
    //4 행 : JPanel p4 배치 -> p4 에는 GridLayout 으로 버튼 네개( 1, 2, 3, x)
    //5 행 : JPanel p5 배치 -> p5 에는 GridLayout 으로 버튼 네개( C, 0, =, ÷)
    // 버튼 레퍼런스 변수 이름 : b0 ~ b9  bplus, bminus, bmulty, bdivide, bequal, bclear
    
    class Calculator extends JFrame implements ActionListener{
    	JTextField jt;
    	int firstNumber;
    	int secondNumber;
    	int result1;
    	double result2;
    	int operator = 0;
    
    	Calculator(){
    		jt = new JTextField(15);
    		Font f = new Font("굴림", Font.BOLD, 20);
    		jt.setFont(f);
    		
    		//JButton b = new JButton("폰트"); 
    		//b.setFont(f); 		// 버튼에 폰트 적용
    		
    		Container con = getContentPane();
    		con.setLayout( new GridLayout( 6,1) );
    		
    		JPanel p1 = new JPanel();
    		JPanel p2 = new JPanel();
    		JPanel p3 = new JPanel();
    		JPanel p4 = new JPanel();
    		JPanel p5 = new JPanel();
    		JPanel p6 = new JPanel();
    		
    		// 텍스프필드가 패널의 가운데로 위치하도록 설정
    		p1.setLayout( new FlowLayout( FlowLayout.CENTER ) ); 
    		jt.setText("0");
    		// 텍스트 필드안에 쓰여지는 숫자(글자)들의 오른쪽 정렬
    		jt.setHorizontalAlignment( SwingConstants.RIGHT );
    		jt.setEditable(false); // 텍스트 필드 임의 수정 불가
    		
    		p1.add(jt);
    		con.add(p1);
    		
    		JButton b7 = new JButton("7");
    		JButton b8 = new JButton("8");
    		JButton b9 = new JButton("9");
    		JButton bplus = new JButton("+");
    		b7.setFont(f);
    		b8.setFont(f);
    		b9.setFont(f);
    		bplus.setFont(f);
    		p2.setLayout( new GridLayout(1,4) );
    		p2.add(b7);
    		p2.add(b8);
    		p2.add(b9);
    		p2.add(bplus);
    		con.add(p2);
    		
    		JButton b4 = new JButton("4");
    		JButton b5 = new JButton("5");
    		JButton b6 = new JButton("6");
    		JButton bminus = new JButton("-");
    		b4.setFont(f);
    		b5.setFont(f);
    		b6.setFont(f);
    		bminus.setFont(f);
    		p3.setLayout( new GridLayout(1,4) );
    		p3.add(b4);
    		p3.add(b5);
    		p3.add(b6);
    		p3.add(bminus);
    		con.add(p3);
            
    		JButton b1 = new JButton("1");
    		JButton b2 = new JButton("2");
    		JButton b3 = new JButton("3");
    		JButton bmulty = new JButton("x");
    		b1.setFont(f);
    		b2.setFont(f);
    		b3.setFont(f);
    		bminus.setFont(f);
    		p4.setLayout( new GridLayout(1,4) );
    		p4.add(b1);
    		p4.add(b2);
    		p4.add(b3);
    		p4.add(bmulty);
    		con.add(p4);
            
    		JButton bclear = new JButton("C");
    		JButton b0 = new JButton("0");
    		JButton bequal = new JButton("=");
    		JButton bdivide = new JButton("÷");
    		bclear.setFont(f);
    		b0.setFont(f);
    		bequal.setFont(f);
    		bdivide.setFont(f);
    		p5.setLayout( new GridLayout(1,4) );
    		p5.add(bclear);
    		p5.add(b0);
    		p5.add(bequal);
    		p5.add(bdivide);
    		con.add(p5);
            
    		JButton back = new JButton("◀");
    		JButton sqr = new JButton("sqr");
    		JButton divide1 = new JButton("1/x");
    		JButton bn = new JButton("%");
    		back.setFont(f);
    		sqr.setFont(f);
    		divide1.setFont(f);
    		bn.setFont(f);
    		p6.setLayout(new GridLayout(1,4));
    		p6.add(back);
    		p6.add(sqr);
    		p6.add(divide1);
    		p6.add(bn);
    		con.add(p6);
            
    		// 각 버튼들에 액션리스너를 다 붙이고, 버튼 클릭시 해당숫자가 텍스트 필드에 표시
    		b0.addActionListener(this);			b1.addActionListener(this);
    		b2.addActionListener(this);			b3.addActionListener(this);
    		b4.addActionListener(this);			b5.addActionListener(this);
    		b6.addActionListener(this);			b7.addActionListener(this);
    		b8.addActionListener(this);			b9.addActionListener(this);
    		bplus.addActionListener(this);   	bminus.addActionListener(this);
    		bmulty.addActionListener(this);		bdivide.addActionListener(this);
    		bequal.addActionListener(this);   	bclear.addActionListener(this);
    		
    		back.addActionListener(this);
    		sqr.addActionListener(this);
    		divide1.addActionListener(this);
    		bn.addActionListener(this);
    		
    		setTitle("계산기  실습");
    		setSize(300,300);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
    		String s = e.getActionCommand();
    		String oldText = jt.getText();
    		if( oldText.equals("0") ) oldText = "";
    		switch(s) {
    			case "+" :
    				operator = 1;
    				firstNumber = Integer.parseInt(  jt.getText()  );
    				jt.setText("0");
    				break;
    			case "-" :
    				operator = 2;
    				firstNumber = Integer.parseInt(  jt.getText()  );
    				jt.setText("0");
    				break;
    			case "x" :
    				operator = 3;
    				firstNumber = Integer.parseInt(  jt.getText()  );
    				jt.setText("0");
    				break;
    			case "÷" :
    				operator = 4;
    				firstNumber = Integer.parseInt(  jt.getText()  );
    				jt.setText("0");
    				break;
    			case "%":
    				operator = 5;
    				firstNumber = Integer.parseInt(  jt.getText()  );
    				jt.setText("0");
    				break;
    			case "=" :
    				switch( operator ) {
    					case 1:
    						secondNumber = Integer.parseInt( jt.getText() );
    						result1 = firstNumber + secondNumber;
    						jt.setText( String.valueOf( result1 ) );
    						break;
    					case 2:
    						secondNumber = Integer.parseInt( jt.getText() );
    						result1 = firstNumber - secondNumber;
    						jt.setText( String.valueOf( result1 ) );
    						break;
    					case 3:
    						secondNumber = Integer.parseInt( jt.getText() );
    						result1 = firstNumber * secondNumber;
    						jt.setText( String.valueOf( result1 ) );
    						break;
    					case 4:
    						secondNumber = Integer.parseInt( jt.getText() );
    						result2 = firstNumber / (double)secondNumber;
    						jt.setText( String.valueOf( result2 ) );
    						break;
    					case 5:
    						secondNumber = Integer.parseInt( jt.getText() );
    						result1 = firstNumber % secondNumber;
    						jt.setText( String.valueOf( result1 ));
    						break;
    				}
    				break;
    			case "C" :
    				jt.setText("0");
    				break;
    				
    			case "◀":
    				// substring()  과 length() 활용하여  백스페이스 키를 완성
    				// 맨왼쪽(첫글자)부터 마지막글자 바로 전글자까지.... getting 함
    				
    				// 총글자수 -1만큼 왼쪽부터 substring으로 취함. 그리고 취한 내역을 setText함
    				
    				// jt.getText().length()  : 텍스트 필드에 있는 글자의 총갯수
    				// 98765가 있다면 총글자갯수 5, 인덱스는 0번부터 4번까지
    				// 이중 9876만 취하고 싶다면, substring에 0, 4라고 써야 0~3번 글자 추출
    				// 그 말은 곧 length() 메서드를 사용했다면 
    				// 문자열.substring(0, 문자열.length()-1)
    				if( jt.getText().length() == 1 ) {
    					jt.setText("0");
    				} else {
    					String t = jt.getText();
    					int n = t.length();
    					String str = t.substring(0, n-1);
    					jt.setText(str);
    				} 
    				break;
    			case "sqr":
    				// 현재 텍스필드에 있는 숫자의 제곱근을 계산한후 다시 텍스트 필드에 넣음
    				if( jt.getText().equals("0") ) break;
    				result2 = Math.sqrt(  Integer.parseInt(jt.getText())  );
    				jt.setText( String.valueOf(result2) );
    				break;
    			case "1/x":
    				// 1 나누기 텍스트필드 숫자  의 결과를 텍스트 필드에 넣음
    				if( jt.getText().equals("0")) break;
    				result2 = 1.0 / (double)Integer.parseInt(jt.getText());
    				jt.setText( String.valueOf(result2) );
    				break;
    			
    			case "0": case "1": case "2": case "3": case "4": case "5": 
    			case "6": case "7": case "8": case "9":
    				jt.setText(oldText + s);
    		}
    		
    		/*
    		switch(s) {
    			case "0":
    				jt.setText(oldText + "0");
    				break;
    			case "1":
    				jt.setText(oldText + "1");
    				break;
    			case "2":
    				jt.setText(oldText + "2");
    				break;
    			case "3":
    				jt.setText(oldText + "3");
    				break;
    			case "4":
    				jt.setText(oldText + "4");
    				break;
    			case "5":
    				jt.setText(oldText + "5");
    				break;
    			case "6":
    				jt.setText(oldText + "6");
    				break;
    			case "7":
    				jt.setText(oldText + "7");
    				break;
    			case "8":
    				jt.setText(oldText + "8");
    				break;
    			case "9":
    				jt.setText(oldText + "9");
    				break;
    		}
    		*/
    	}
    }
    
    public class Swing12 {
    	public static void main(String[] args) {
    		new Calculator();
    	}
    }
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Calendar;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    
    class Calendars extends JFrame implements ActionListener{
    	int year;
    	int month;
    	JTextField [] jt = new JTextField[42];  // 해당달력의 날짜가 나오는 텍스트 필드의 배열
    	
    	JTextField y;  // 직접 입력하여 년도와 월을 선택할 텍스트 필드
    	JTextField m;  // 직접 입력하여 년도와 월을 선택할 텍스트 필드
    	
    	Calendars(){
    		Container con = getContentPane();
    		con.setLayout(new BorderLayout());
    		
    		JPanel jp1 = new JPanel();
    		JPanel jp2 = new JPanel();
    		JPanel jp3 = new JPanel();
    		
    		jp1.setLayout(new GridLayout(1,7));   // 일~토 요일 표시 라벨 또는 버튼용 패널
    		jp2.setLayout(new GridLayout(6,7));   // 1~말일까지 날짜표시될 텍스트필드용 패널
    		jp3.setLayout(new FlowLayout()); // 이전달 다음달버튼과 현재년도 현재월 등이 표시
    		
    		jp1.add(new JButton("일")).setForeground(Color.RED);
    		jp1.add(new JButton("월"));
    		jp1.add(new JButton("화"));
    		jp1.add(new JButton("수"));
    		jp1.add(new JButton("목"));
    		jp1.add(new JButton("금"));
    		jp1.add(new JButton("토")).setForeground(Color.BLUE);
    		con.add(jp1, BorderLayout.NORTH);
    		
    		Font f = new Font("굴림", Font.BOLD, 20);
    		
    		for( int i = 0; i<42; i++) {
    			jt[i] = new JTextField(); // 텍스트 필드 객체 생성
    			jt[i].setFont(f);  // 폰트 설정
    			jt[i].setHorizontalAlignment(SwingConstants.RIGHT);  // 정렬방향 설정
    			jt[i].setEditable(false);   // 편집 불가능 설정
    			jt[i].setBackground(Color.WHITE);  // 배경색 설정
    			
    			if(i%7==6) jt[i].setForeground(Color.BLUE);   // 토요일
    			else if(i%7==0) jt[i].setForeground(Color.RED);    // 일요일
    			else jt[i].setForeground(Color.BLACK);   // 평일
    			jp2.add(jt[i]);   // 현재 택스트 필드를 패널에 얹음
    		}
    		con.add(jp2,BorderLayout.CENTER);
            
    		y =new JTextField(6);
    		y.setFont(f);
    		y.setHorizontalAlignment(SwingConstants.CENTER);
    		y.setBackground(Color.WHITE);
    		
    		m =new JTextField(3);
    		m.setFont(f);
    		m.setHorizontalAlignment(SwingConstants.CENTER);
    		m.setBackground(Color.WHITE);
    		
    		JButton b = new JButton("확인");
    		JButton b1 = new JButton("이전달");
    		JButton b2 = new JButton("다음달");
    		
    		jp3.add(b1);	
    		jp3.add(y);   
    		jp3.add(new JLabel("년 "));
    		jp3.add(m);	
    		jp3.add(new JLabel("월 "));
    		jp3.add(b);		
    		jp3.add(b2);
    		con.add(jp3,BorderLayout.SOUTH);
    		
    		setTitle("스윙 캘린더");
    		setSize(500,500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);		
    		
    		Calendar today = Calendar.getInstance();   // 오늘 날짜 생성
    		y.setText(String.valueOf(today.get(Calendar.YEAR)));   // 년도 추출 -> 텍스트필드에 표시
    		m.setText(String.valueOf( today.get(Calendar.MONTH)+1 ));   // 월 추출 -> 텍스트필드에 표시
    		year = Integer.parseInt( y.getText() );   // 변수에 저장
    		month = Integer.parseInt( m.getText() );  // 변수에 저장
    		
    		drawCalendar();
    	}
    	
    	private void drawCalendar() {
    		
    		// 해당 년월의 달력을 화면에 표시
    		Calendar sDay = Calendar.getInstance();
    		Calendar eDay = Calendar.getInstance();
    		
    		sDay.set(year, month-1, 1);  // 오늘 날짜 월의 1일로
            eDay.set(year, month, 1);
            eDay.add(Calendar.DATE, -1);  // 오늘 날짜 월의 말일로... 
    		
            int START_WEEK = sDay.get(Calendar.DAY_OF_WEEK); 
            for( int i=START_WEEK-1; sDay.before(eDay)||sDay.equals(eDay); sDay.add(Calendar.DATE, 1) ) {
            	int day = sDay.get(Calendar.DATE);  // 날짜의 "일"만 추출해서
            	jt[i++].setText( String.valueOf(day) );  // 텍스트 필드에 넣음.
            }
            y.setText( String.valueOf(year) );
    		m.setText( String.valueOf(month) );
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    	}
    }
    
    public class Swing13 {
    	public static void main(String[] args) {
    		new Calendars();
    	}
    }

    '언어 > JAVA' 카테고리의 다른 글

    [JAVA] Thread  (0) 2022.09.08
    [JAVA] Exception(예외처리)  (0) 2022.09.08
    [JAVA] Interface  (3) 2022.09.08
    [JAVA] Abstract(추상클래스)  (0) 2022.09.08
    [JAVA] Formatter  (0) 2022.09.08

    댓글

Designed by Tistory.