패키지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를 누르면 레이블에 출력된다.
'국비교육(22-23)' 카테고리의 다른 글
21일차(1)/java(28) : Thread (0) | 2022.11.03 |
---|---|
20일차(3)/java 퀴즈 : Frame객체로 계산기 만들기 (0) | 2022.11.02 |
20일차(1)/java(26) : Frame(2) (0) | 2022.11.02 |
19일차(4)/java(25) : Frame(1) (0) | 2022.11.01 |
19일차(3)/java(24) : Exception (0) | 2022.11.01 |