-
[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