국비교육(22-23)

20일차(2)/java(27) : Frame(3)

서리/Seori 2022. 11. 2. 19:51

 

패키지07 MyFrame

- 06과 다르게 눌러진 버튼의 참조값을 알아내는 대신 ActionCommand 를 사용한다.

package frame07;

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.JOptionPane;

public class MyFrame extends JFrame implements ActionListener{	
	//생성자
	public MyFrame(String title) {
		super(title);
				
		setBounds(100,100,500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new FlowLayout());
		
		//객체 생성해서 참조값을 필드에 저장
		JButton sendBtn=new JButton("전송");
		add(sendBtn);
		//버튼에 ActionCommand를 설정
		sendBtn.setActionCommand("send");
		
		JButton deleteBtn=new JButton("삭제");
		add(deleteBtn);		
		deleteBtn.setActionCommand("delete");
		
		sendBtn.addActionListener(this);
		deleteBtn.addActionListener(this);
	}
	
	public static void main(String[] args) {
		MyFrame f=new MyFrame("나의 프레임7");
		f.setVisible(true);
	}
	/*
	 * 전송버튼, 삭제버튼을 누르면 호출되는 메소드
	 * 메소드 안에서 어떤 버튼을 눌렀는지 확인해서 분기해야한다.
	 * 메소드에 선언된 매개변수 ActionEvent e에 눌러진 버튼에 대한 정보갸 담겨 있다.
	 * 해당 객체를 활용해서 분기를 하면 된다.
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		//눌러진 버튼의 액션 command값을 읽어온다.
		String command=e.getActionCommand();
		if(command.equals("send")) {
			JOptionPane.showMessageDialog(this, "전송합니다.");
		}else if(command.equals("delete")) {
			JOptionPane.showMessageDialog(this, "삭제합니다.");
		}
	}
}

.setActionCommand();

- () 안에 String타입을 전달해서 그것을 명령어로 사용할 수 있다.

 

if(command.equals("send")) {}

- 문자열 타입을 command == "send" 형태로 비교하면 안된다! equals 사용.

 


 

패키지08 MyFrame

- TextField객체 사용

package frame08;

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.JOptionPane;
import javax.swing.JTextField;

/*
 * JTextField 객체의 메소드를 잘 활용해서
 * 메세지를 입력하고 전송 버튼을 누르면
 * 입력한 메세지가 알림창에 출력되도록 프로그래밍해보세요. 
 */
public class MyFrame extends JFrame{
	//생성자
	public MyFrame(String title) {
		super(title);
		setBounds(100,100,500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//흐르듯이 배치하는 레이아웃
		setLayout(new FlowLayout(FlowLayout.CENTER));
		
		//문자열을 한줄 입력할 수 있는 JTextField
		JTextField inputMsg=new JTextField(10);
		JButton sendBtn=new JButton("전송");
		
		add(inputMsg);
		add(sendBtn);
				
		//버튼을 눌렀을 때 실행할 메소드를 가지고 있는 객체를 등록하는 메소드
		sendBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//입력한 문자열 읽어오기
				String msg=inputMsg.getText();
				//알림으로 띄우기
				JOptionPane.showMessageDialog(MyFrame.this, msg);	
			}
		});	

		setVisible(true);	
	}
	
	public static void main(String[] args) {
		new MyFrame("나의 프레임8");
	}
}

 

 

- JTextField 를 넣어주면 한 줄을 입력할수있는 입력이 생긴다.

- javascript의 input 박스

 

로컬 이너클래스 { } 안에서 지역변수 inputMsg가 참조된다.

따로 필드를 설정하지 않아도 지역변수를 참조할 수 있다.

 

ActionListener listener=new ActionListener;  → ActionListener 객체를 생성
sendBtn.addActionListener( listener );  버튼을 눌렀을 때 실행할 메소드를 가지고 있는 객체를 등록하는 메소드

- 위와 같은 형태로 만들어져야 하는데,

 Actionlistener는 인터페이스 타입이어서 단독으로 객체를 생성할 수 없다.

 

sendBtn.addActionListener( new ActionListener );

- 위와같이 쓰면 override시켜서 익명의 이너클래스를 만들 수 있다.

 


패키지09 MyFrame

 

- 08과 똑같은데 ActionListener를 구현하고 JTextField를 필드로 선언한 버전.

 

package frame09;

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.JOptionPane;
import javax.swing.JTextField;

/*
 * JTextField 객체의 메소드를 잘 활용해서
 * 메세지를 입력하고 전송 버튼을 누르면
 * 입력한 메세지가 알림창에 출력되도록 프로그래밍해보세요. 
 */
public class MyFrame extends JFrame implements ActionListener{
	//필드
	JTextField inputMsg;
	
	//생성자
	public MyFrame(String title) {
		super(title);
		setBounds(100,100,500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//흐르듯이 배치하는 레이아웃
		setLayout(new FlowLayout(FlowLayout.CENTER));
		
		//문자열을 한줄 입력할 수 있는 JTextField 객체를 생성해서 참조값을 필드에 담기
		inputMsg=new JTextField(10);
		JButton sendBtn=new JButton("전송");
		
		add(inputMsg);
		add(sendBtn);
		
		//ActionListener 인터페이스를 구현한 MyFrame 객체를 액션 리스너로 등록을 한다.
		sendBtn.addActionListener(this);

		setVisible(true);	
	}
	
	public static void main(String[] args) {
		new MyFrame("나의 프레임9");
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		//1. TextField에 입력한 문자열을 읽어와서(필드 선언 필요) 
		String msg=inputMsg.getText();
		//2. 알림창에 출력하기
		JOptionPane.showMessageDialog(this, msg);		
	}
}

 

- ActionListener 인터페이스를 implement하면

 MyFrame 자체가 버튼을 눌렀을때 호출될 메소드를 가지고 있는 것이 된다.

 

- 지역변수로 선언되어있었던 inputMsg 를 필드로 옮긴다.

 override하면서 생긴 actionPerformed 메소드 안에서 참조하기 위해!

 


 

패키지10 MyFrame

- JLabel 사용, 키값 읽어오기

 

package frame10;

import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

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

public class MyFrame extends JFrame{
	//생성자
	public MyFrame(String title) {
		super(title);
		setBounds(100,100,500,500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//흐르듯이 배치하는 레이아웃
		setLayout(new FlowLayout(FlowLayout.LEFT));
		
		JTextField inputMsg=new JTextField(10);
		JLabel label=new JLabel("레이블..."); 
		
		add(inputMsg);
		add(label);
		
		//키보드를 눌렀을때 호출될 메소드를 가지고있는 KeyListener 인터페이스 type 객체
		KeyListener listener=new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				System.out.println("keyTyped()");
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				System.out.println("keyPressed()");
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				System.out.println("keyReleased()");
				//눌러진 키의 코드값 읽어오기
				int code=e.getKeyCode();
				System.out.println("code:"+code);
				if(code == KeyEvent.VK_ENTER) { //code==10
					//입력한 문자열을 읽어와서
					String msg=inputMsg.getText();
					//label에 출력하기 
					label.setText(msg);
				}
			}
		};
		
		inputMsg.addKeyListener(listener);
		
		setVisible(true);	
	}
	
	public static void main(String[] args) {
		new MyFrame("나의 프레임10");
	}
}

 

- Label은 글자를 출력할 수 있는 UI

- JTextField로 입력한 값을 엔터를 치면 레이블에 나타나도록 만들 예정!

 

 

.addKeyListener : 키보드에 관련된 이벤트. 키보드를 누를때마다 호출될 메소드를 가지고 있는 리스너!(인터페이스)

 

- 인터페이스라서 이렇게는 생성이 안되므로, 자동으로 익명의 inner클래스가 작성된다.

 

- KeyListener 안에 있던 3개의 미완성 메소드가 나오는데

키를 누를 때마다 세가지가 반복되어 나온다. 계속 누르고 있으면 Pressed / 키를 뗐을 때는 Released

 

 

.getKeyCode(); : 키의 코드값을 읽어오는 메소드 (int 타입 반환)

 

public void keyReleased(KeyEvent e) {
    System.out.println("keyReleased()");    
    int code=e.getKeyCode();
    System.out.println("code:"+code);
}

 

- 콘솔창에 출력해오는 것으로 엔터 키의 코드값이 10이라는 것을 읽어올 수 있다.

 

 

- KeyEvent에서 찾으면 엔터를 누르는 키값 또한 SF필드(상수)로 준비되어 있다.

 

code == KeyEvent.VK_ENTER

code == 10

두개는 같은 코드이다!

 

String msg=inputMsg.getText();
label.setText(msg);

- msg라는 변수에 inputMsg 에 들어온 값을 가져와 넣어서, 레이블에 msg 값을 출력해 준다.

 

getText(); : Text Component에서 입력받은 문자열을 리턴해주는(가지고 오는) 메소드

setText(); : 문자열을 Label에 출력해주는 메소드(세팅해서 보여주는)

 

- 텍스트를 입력하고 enter를 누르면 레이블에 출력된다.