반응형

**Event처리

=>Event는 외부에서 발생하는 사건

=>자바의 awtswing의 이벤트 처리는 Listener인터페이스나 Adapter클래스가 처리합니다.

1.이벤트 처리 방법

=>처리하고자 하는 이번트의 Listener인터페이스를 Implements하거나 Adapter클래스를 상속받은 클래스의 인스턴스를 생성

=>컴포넌트.add이벤트리스너(앞에서 생성한 인스턴스);

 

=>이러한 방식의 처리를 Delegate(위임)를 이용한 처리 방식

이벤트가 발생한 객체가 이벤트를 처리하는 것이 아니고 이벤트가 발생한 객체가 다른 객체에게 이벤트 처리를 위임하는 방식

컴포넌트는 출력에만 집중하고 다른 작업은 별도의 객체가 처리하는 것이 유지보수에 유리

 

=>이벤트 처리하는 메소드를 확인

이 메소드의 매개변수를 이용하면 이벤트가 발생한 객체에 대한 정보를 가져올 수 있습니다.

자바에서는 getSource()를 호출하면 이벤트가 발생한 객체에 대한 참조를 리턴받을 수 있습니다.

가지고 있는 메소드들이 이벤트별로 다른데 이 메소드들이 이벤트에서 사용할 정보를 리턴해줍니다.

키보드 이벤트가 어떤 이벤트 인지

 

2.이벤트 처리 실습

=>버튼을 누르거나 메뉴를 누르는 경우 또는 TextField에서 Return키를 누르는 경우를 처리할 때는 ActionListener를 이용해서 처리

=>버튼과 텍스트 필드를 만들고 버튼을 누르면 텍스트 필드에 입력된 내용을 콘솔에 출력

 

1) Anonymous클래스를 이용하는 방법

디자인 처리랑 이벤트 처리가 같이 되여있다.

책은 같이 사용하는 것으로 되여있다.

책과 실제로 일하는 것은 다르다.

실제 연습할 때는 분할 해서 해야 한다.

=>실습

public class MyWindow extends Frame {

       private Button btn;

       private TextField tf;

      

       public MyWindow() {

               //여러개의 컴포넌트를 묶어줄 container생성

               //안드로이드에서는 layout이다.

               Panel p  = new Panel();

              

               //컴포넌트들을 생성

               btn = new Button("click");

               tf = new TextField(30);

              

               //버튼의 이벤트 처리를 위한 ActionListener인터페이스의 anonymous clss생성

               //자바에서는 listener 대부분 인터페이스이다.

               ActionListener listener = new ActionListener() {

                      //버튼을 누르거나 텍스트 필드에서 Return누르거나 메뉴를 누르면 호출되는 메소드

                      @Override

                      public void actionPerformed(ActionEvent e) {

                             //입력한 내용 가져옥

                             String msg = tf.getText();

                             //출력

                             System.out.println(msg);

                      }

               };

               //btn에서 Action이벤트가 발생하면 listener 대신 처리하도록 위임(Delegation)

               //btn.addActionListener(listener);

              

               //컴포넌트들을 컨테이너에 배치

               p.add(tf);

               p.add(btn);

              

               //컨테이너를 윈도우에 배치

               add(p);

              

               //Frame 기본 설정

               setTitle("이벤트 처리");

               setLocation(100, 100);

               setSize(300, 400);

               setVisible(true);

       }

 

}

 

 

2) .별도의 이벤트 처리 클래스를 생성해서 이벤트를 처리

이벤트 처리하는 것은 handler가 있다.

나중에 연결만해주면 된다.

하지만 생성자를 생성하는 것을 알아야 한다.

작업을 나누어서 하는 것이 편하다ㅏ.

ActionListener인터페이스를 impelements한 클래스를 생성 - EventHandler

public class EventHandler implements ActionListener {

       private TextField tf;

      

       //생성자 -TextField 1개를 주입받는 생성자

       public EventHandler(TextField tf) {

               this.tf = tf;

       }

 

       @Override

       public void actionPerformed(ActionEvent e) {

               String msg = tf.getText();//오류가 난다. TextFiled 업다.

               System.out.println(msg);

       }

 

}

 

=>MyWindow클래스의 생성자에서 이벤트 연결

               //이벤트 처리를 위한 인스턴스를 생성

               //다른데에서 사용하고 싶을 생성자를 해서 넣어주면 사용 가능하다.

               EventHandler handler = new EventHandler(tf);

               btn.addActionListener(handler);

 

 

 

3.인터페이스를 이용하는 방법

1)인터페이스를 구현한 클래스를 만들고 인스턴스를 만드는 방법

=>유지보수를 위해서는 이 방식을 권장

=>생성자나 Setter메소드를 이용해서 데이터를 넘겨야 하는 어려움이 있음

 

2)인터페이스를 가지고 Anonymous Class를 만드는 방법

=>일반적인 자바(안드로이드)책에서 많이 사용하는 방법

=>이 방법은 컴포넌트가 구현된 클래스에 만들기 때문에 클래스의 변수 사용이 자유로워서 많이 이용

 

3)특수한 인터페이스의 경우는 람다를 이요하는 방법

=>Android Studio는 이 방식으로 최적화

 

4.Event Routing

=>여러 개의 이벤트를 하나의 인스턴스가 처리하도록 하는 방법

=>1개의 이벤트를 1개의 인스턴스가 처리하도록 하면 여러 개의 이벤트를 처리 할때 인스턴스의 개수가 늘어나고 제어하기가 어려워집니다.

=>이 때는 이벤트 처리 메소드에서 이벤트가 발생한 인스턴스를 구분해서 분기를 해야 합니다.

awtswing에서는 이벤트 처리 메소드의 매개변수가 getSource()를 호출하면 이벤트가 발생한 객체의 참조를 리턴하기 때문에 이를 이용해서 구분할 수 있고 ActionEvent의 경우는 getActionCommand()를 호출하면 문자열을 리턴해주는데 이 문자열이 버튼의 텍스트입니다.

getSource()를 사용하는 경우는 배열이나 List인 경우

배열이나 List는 반복문을 사용할 수 있다.

 

Button [] btn = new Button[3];

for(int i = 0; i<3, i++){

System.out.println("버튼" +"i")

}

버튼을 3개 만들 때

Button btn1, btn2, btn3;

btn1 = new Button("버튼1");

btn2 = new Button("버튼2");

btn3 = new Button("버튼3");

 

배열이나 리스트 이용하면 비교하기도 편하고

관리하기도 편하다.

=>이전 Frame에 버튼을 2개 추가해서 이벤트 라우팅 구현-MyWindow클래스에서 작업

1)인스턴스 변수로 버튼을 2개 추가

       private Button btn1, btn2;

       private Button[] buttons = new Button[2];

 

2)생성자 메소드에서 버튼 2개를 만들어서 윈도우에 추가

       //버튼을 생성해서 패널에 추가

               btn1= new Button("button1");

               p.add(btn1);

              

               btn2= new Button("button2");

               p.add(btn2);

              

               //버튼의 이벤트 처리 -라우팅을 이용하지 않는 경우

               // 경우 많으면 힘들다.

               /*ActionListener event1 = new ActionListener() {

                      //버튼을 누르거나 텍스트 필드에서 Return누르거나 메뉴를 누르면 호출되는 메소드

                      @Override

                      public void actionPerformed(ActionEvent arg0) {

                             System.out.println("버튼1 클릭했습니다.");

                      }

               };

               btn1.addActionListener(event1);

              

               ActionListener event2 = new ActionListener() {

                      //버튼을 누르거나 텍스트 필드에서 Return누르거나 메뉴를 누르면 호출되는 메소드

                      @Override

                      public void actionPerformed(ActionEvent arg0) {

                             System.out.println("버튼2 클릭했습니다.");

                      }

               };

               btn2.addActionListener(event2);*/

              

               //이벤트 라우팅을 이용하는 방법

               ActionListener eventRouting = new ActionListener() {

                      //버튼을 누르거나 텍스트 필드에서 Return누르거나 메뉴를 누르면 호출되는 메소드

                      @Override

                      public void actionPerformed(ActionEvent arg0) {

                             //arg0.getActionCommand() 경웬느 text 사용해야 한다.

                             /*switch(arg0.getActionCommand()) {

                             case "button1":

                                    System.out.println("버특1클릭");

                                    break;

                             case "button2":

                                    System.out.println("버특2클릭");

                                    break;

                             }*/

                             System.out.println(arg0.getActionCommand() +" 예약");

                      }

               };

               btn1.addActionListener(eventRouting);

               btn2.addActionListener(eventRouting);

 

=>P 만들고 후에 코드를 추가해야 합니다.

패널을 만들고 해야 한다.

 

5.ItemEvent

=>체크박스 라디오 버튼 이나 콤보박스(Choice) 선택을 변경하는 경우에 발생하는 이벤트

=>ItemListener인터페이스 처리

=>이벤트 처리 메소드의 매개변수가 getItem() 호출하면 어떤 Item 이벤트가 발생했는지 있고 getStateChange()메소드를 호출하면 어떤 상태로 변경되었는지 확인이 가능

 

6.TextListener

=>TextField TextArea에서 텍스트의 변경이 발생했을 때를 처리하는 리스너

=>TextValueChanged(TextEvent e)메소드를 이용해서 처리

=>텍스트가 변경될 상태 변화에 따라 메시지를 출력하거나 유효성을 검사하는 용도로 사용

 

영문대소문자 그리고 숫자 특수문자가 1 이상이면 강함이라고 출력

그렇지 않은 경우에는 약함이라고 출력

특수문자는 영문 대소문자가 아니고 숫자도 아니면 특수문자로 판단

 

               //텍스트 필드나 텍스트 에어리어의 문자열이 변경될 처리를 위한 인스턴스

               TextListener t1 = new TextListener() {

                     

                      @Override

                      public void textValueChanged(TextEvent e) {

                             //텍스트 필드에 입력된 문자열을 가져오기

                             String msg = tf.getText();

                             //대소문자 숫자 ,특수문자 개수를 저장할 변수를 생성

                             int dae = 0;

                             int so = 0;

                             int su = 0;

                             int etc =0;

                            

                             //문자열을 문자단위로 접근

                             for(int i = 0;i < msg.length(); i++) {

                                    //앞에서 부터 한글자씩 가져오기

                                    char ch = msg.charAt(i);

                                    //System.out.println(ch);

                                    if(ch >= 'A' && ch <= 'Z') {

                                            dae += 1;

                                    }else if(ch >= 'a' && ch <= 'z') {

                                            so += 1;

                                    }else if(ch>= '0'  && ch <= '9'){

                                            su += 1;

                                    }else {

                                            etc += 1;

                                    }

                             }

                            

                             /*if(dae >0 && so > 0 && su >0 && etc>0) {

                                    System.out.println("강함");

                             }*/

                            

                             if(dae * so * su  * etc != 0) {

                                    System.out.println("강함");

                             }else {

                                    System.out.println("약함");

                             }

                      }

               };

               tf.addTextListener(t1);

 

**keyListener

=>키보드 이벤트를 처리하기 위한 리스너

1)처리를 위한 메소드

void keyPressed(keyEvent e);키보드를 누를

 

void keyReleased(keyEvent e);키보드에서 손을

 

void keyTypers(keyEvent e);키보드를 누르고 누른 키가 문자 키일 호출되는 메소드

keyPressed 키보드 위치만을 감지를 해서 대소문자 구분을 하지 못했고   keyTypers 대소문자 구분을 했습니다.

 

2)keyEvent클래스

=>모든 key값이 상수로 정의되어 있습니다.

=>getKeyChar() 이용해서 누른 문자를 가져올 있고  getKeyCode() 이용해서 누른 키보드의 숫자 값을 가져올 있습니다.

 

 

c, java, c# ..

옵션을 만들때 int enum 이용

int enum =>정수

python 문자열로 만든다.함수를 찾아도 어려운 이유가 여기 있다. 옵션들이 문자로 되여있다.

문자열 dictionary

color = ""

 

성별

python => String str = "";

 

c,java int gender  ->0 남자

                    ->1 여자

숫자 경우 2여도 되고 3 되고

java, c 상수 만들 경우 대문자로 쓴다.

int MAN = 0; //남자

int MAN = 1;

 

=> 바꿀 경우

final int WOMAN = 0;

       int MAN =1;

 

옵션 -> 택일 : 일련번호사용 (성별 ) - 영문자( A: 65, B : 66, C:67  ..)

     -> 다중선택(취미등 ) : 2 지수승 사용

취미 현재 2개이다

독서

컴퓨터

ð  4가지 경우가 있다.

1.  하나도 선택 안한

2.  독서

3.  컴퓨터

4.  독서 + 컴퓨터

독서 , 컴퓨터 , 복싱 = > 8

독서 ,컴퓨터 , 복싱 , 1 = > 16

여러개 옵션을 사용한 것은 이렇게 사용하면 안된다. 그래서 비트로 한다.

 

복싱

컴퓨터

독서

 

0

0

0

 

1

1

1

 

독서    1

컴퓨터  2

복싱    4

독서 + 복싱 : 5

하나의 BIT 하나이다.

옵션이 많으면 감당할 없다. 4, 5, 6, 7.....

그래서 1인지 확인 해야 한다. 1인지 확인 하는 방법은 &1 이다.나머지는 0이니깐

 

& 0 & 1 =>0

  1 & 1 =>1

 

키보드 문자키는 같이 못눌린다.

 

CTRL: 128

ALT : 512

512 640이나 물어보는 것은 낭비이다.

그래서 & 512한다.

0 & 512 => 0

0 아닌것 하고 하면 512

CTRL 경우에는 & 128

 

두가지

판단 ALT, SHIFT, ALT, MOUSE 감지

 

특정 os 타겟팅  ->여기는 숫자로 쓰준다. 확정되여있다.

swift(Object -c)       ios

andriod  ->안드로이드

vc ++ vc## -> windows 윈도우용

 

shift : 4

 

java->플랫폼의 독립적 운영체제마다 달라서 확정 주지 않다. 운영체제 특징도 많이 알아야 한다. 운영체제마다 값이 다르기 때문이다.

자바는 shift 4

thread 운영체제제에서  thread우선순위가 다르다.

window 10 이고 7이다.

 

 

자바나 ,python 윈도우형이 별로 없는 이유가 vc++, vc##편하기 때문이다.

 

ctrl+->   -> 가속도 10으로

ctrl+s ->자동 발사 s-> 싸는

 

 

 

3) 방향키를 이용해서 레이블을 움직이고 control + x 누르면 프로그램 종료하는 윈도우

KeyWindow

//키보드 이벤트 처리를 위한 인스턴스를 생성

               KeyListener listener  = new KeyListener() {

                      //키보드를 눌렀을 호출되는 메소드

                      @Override

                      public void keyPressed(KeyEvent arg0) {

                             //조합키 확인: shift -1, control -2 , alt -8

                             int modifiers = arg0.getModifiers();

                             //System.out.println(modifier);

                             //contlol+ X이면 종료

                             if((modifiers &2 ) != 0) {

                                    //별도로 누른 키가 X인지 확인 -대소문자 구분해서 하고자 하는 경우는 getKeyChar()

                                    int key = arg0.getKeyCode();

                                    if(key == KeyEvent.VK_X) {

                                            System.exit(0);

                                    }

                             }

                            

                             //System.out.println("아무 키나 누르면 호출됩니다.");

                             //대다수의 프로그램 언어가 유사하게 만들어졌다.

                            

                             //KeyChar 대소문자 구분 a->a A->A

                             //System.out.println(arg0.getKeyChar());

                             //keyCode 대소문자 구분 안함: a->64 A->65 방향키

                             //System.out.println(arg0.getKeyCode());

                            

                             //현재 레이블의 위치 가져오기

                             int x = lbl.getLocation().x;

                             int y = lbl.getLocation().y;

                            

                             //누른 키보드 가져오기

                             int code = arg0.getKeyCode();

                             switch(code){

                             case KeyEvent.VK_UP:

                                    y = y -5;

                                    break;

                             case KeyEvent.VK_DOWN:

                                    y = y + 5;

                                    break;

                             case KeyEvent.VK_LEFT:

                                    x = x -5;

                                    break;

                             case KeyEvent.VK_RIGHT:

                                    x = x + 5;

                                    break;

                             }

                             lbl.setLocation(x, y);

                      }

                      //키보드에서 손을 호출되는 메소드

                      @Override

                      public void keyReleased(KeyEvent arg0) {

                             //System.out.println("키보드에서 손을 때면 무조건 호출");

                      }

                      //문자키를 눌렀을 호출되는 메소드

                      @Override

                      public void keyTyped(KeyEvent arg0) {

                             //System.out.println("문자 키를 눌렀을 호출");

                      }

               };

               //윈도우에 키보드 이벤트 리스터를 연결

               this.addKeyListener(listener);

 

 

8.MouseListener

=>마우스 이벤트를 처리해주는 리스터

=>클릭 , 영역에 마우스가 들어온 경우 , 영역에서 벗어나는 경우 ,마우스는 누를 , 마우스에서 손을 땔때 처리를 위한 메소드가 존재

=>MouseEvent에서는 마우스의 좌표를 리턴해주는 메소드와 클릭 횟수 등을 리턴해주는 메소드가 존재

 

 

9.MouseMotionListener

=>마우스를 드레그 때를 처리해주는 리스너

=>버튼을 누르고 움직일 때는 위한  Dragged메소드와 마우스를 움직이면 무조건 호출되는 Moved 메소드가 존재

 

 

10.WindowListener

=>윈도우 이벤트를 처리해주는 리스너

=>윈도우 관련된 7개의 이벤트 처리 메소드가 존재

=>윈도우의 종료 버튼을 누를 처리를 위한 메소드는 windowClosing

이전 윈도우의 생성자에 종료 버튼을 누를 프로그램이 종료되도록 이벤트 처리 코드를 추가

WindowListener windowListener = new WindowListener() {

                      //7개가 만들어진다.

                      @Override

                      public void windowActivated(WindowEvent e) {

                             // TODO Auto-generated method stub

                            

                      }

                     

                      @Override

                      public void windowClosed(WindowEvent e) {

                             // TODO Auto-generated method stub

                            

                      }

                     

                      @Override

                      public void windowDeactivated(WindowEvent e) {

                            

                      }

                     

                      //종료 버튼을 누를 호출되는 메소드

                      @Override

                      public void windowClosing(WindowEvent e) {

                             //프로그램 종료

                             System.exit(0);

                      }

                     

                      @Override

                      public void windowDeiconified(WindowEvent e) {

                            

                      }

                     

                      @Override

                      public void windowIconified(WindowEvent e) {

                            

                      }

                     

                      @Override

                      public void windowOpened(WindowEvent e) {

                            

                      }

               };

               //윈도우 이벤트 연결

               this.addWindowListener(windowListener);

사용하지도 않는 메소드를 overriding해놓았다.

 

 

11.이벤트 처리를 Listener인터페이스를 이용해서 처리하도록 하면 실제 사용하는 메소드는 1 밖에 없는 인터페이스의 메소드는 전부 추상 메소드라서 반드시 재정의 해야 합니다.

java awt에서는 메소드가 2 이상인 Listener들을 Adapter클래스에 비여있는 내용으로 구현해서 필요한 메소드만 재정의 있도록 Adapter class 제공합니다.

Adapter class 전부 추상 클래스라서 직접 인스턴스를 생성하지 못합니다.

 

앞의 윈도우 이벤트 처리 구문을 수정

               //Listener 인터패이스라서 모든 메소드를 구현해야 하지만

               //Adapter 추상클래스라서 추상메소드 필요한 메소드만 구현하면 됩니다.

               WindowAdapter windowListener= new WindowAdapter() {

                      //종료 버튼을 누를 호출되는 메소드

                      @Override

                      public void windowClosing(WindowEvent e) {

                             //프로그램 종료

                             System.exit(0);

                      }

               };

               //윈도우 이벤트 연결

               this.addWindowListener(windowListener);

 

 

**Swing

=>jvm 자원을 이용해서 GUI(Graphic User Interface)프로그래밍

=>플랫폼에 독립적인 프로그래밍

=>AWT보다 속도도 빠르고 효율적

 

**Container

1.JFrame

=>윈도우 클래스

=>종료 기능을 부여할 때는 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 호출

=>pack이라는 메소드를 제공해서 윈도우 전체 크기를 하위 COmponent들을 배치한 크기로 설정

=>setIconImage(Image image) 이용해서 아이콘 설정 가능

 

2.전체 화면 크기 구하기

Tookit toolkit = Tookit.getDefaultToolkit();

Dimension size = toolkit.getScreenSize();

 

3.JPanel

=>패널 클래스

=>생성자에 Panel(boolean isDoubleBuffered):더블 버퍼링 여부를 설정

더블 버퍼링: 출력할 내용을 메모리에 저장해두고 출력하는 방식

            메모리 사용량은 늘어나지만 다음에 다시 출력할 출력 속도를 빠르게 해줍니다.

4.JScrollPane

=>스크롤 기능을 가진 클래스

=>부모 화면보다 컴포넌트를 배치할 사용

=>생성자를 호출해서 인스턴스를 만들 하위 컴포넌트를 대입

 

 

**Swing 일반 컴포넌트

1.경계선 설정 기능(Border)

=>setBorder메소드에 AbstractBorder클래스의 하위 클래스 인스턴스를 대입하면 경계선이 만들어집니다.

=>AbstractBorder클래스의 하위 클래스 :BevelBorder, CompoundBorder, EmptyBorder, EctchedBorder, TitleBorder

 

2.Component 마우스를 올리면 보여지는 tooltip 설정 기능

=>setTooltipText메소드에 문자열을 대입하면 툴팁이 만들어집니다.풍선 도움말

 

 

3.JLabel

=>문자열 출력을 위한 컴포넌트

=>생성자에서 Icon 대입하면 이미지 출력 가능

맞춤 설정도 가능합니다.

 

 

 

 

4.버튼

=>AbstractButton(추상클래스) 클래스로 부터 상속받은 클래스를 이용

=>JButton,JTOGGLEButton,JRadioButton 으로 구분

=>현재 윈도우에 버튼을 추가해서 버튼을 누를 마다 애니메이션을 시작하고 중지하는 기능을 구현

=>스레드를 만들어야 하는 순간

중간중간 다른 작업을 수행할 있도록 만들어야

실행 중간에 멈출수 있도록 해야

네트워크에서 다운로드나 업로드를 받을 (오랜 시간이 걸리는 작업)

상바대는 작업이라면 버튼 하나면 된다. 시작 중지

public class MyFrame extends JFrame {

       JLabel lbl;

       ImageIcon icon;

       JButton btn;

       //여기에서 만든 변수는 자동 초기하된다.

       //애니메이션을 수행할 스레드 변수

       Thread th;//자바는 네트워크 작업할 스레드 필수 하니깐

       public MyFrame() {

               JPanel p = new JPanel();

               //JLabel lbl = new JLabel("문자열");

               //이미지를 가지고 아이콘을 생성

               //이미지 파일 크기 그래도 성성됩니다.

               icon = new ImageIcon("C:\\project\\JAVA_PROJECT\\java\\src\\java\\img\\heli1.png");

               lbl = new JLabel(icon);

               p.add(lbl);

              

               //버튼을 만들어서 패널에 추가

               btn =   new JButton("시작");

               p.add(btn);

              

               //버튼을 누를 이밴트 처리를 위한 인스턴스를 생성

               //위임해도 실행하는데는 아무런 영향이 없다.

               ActionListener listener = new ActionListener() {

                      @Override

                      public void actionPerformed(ActionEvent e) {

                             switch(e.getActionCommand()) {

                             case "시작":

                                    btn.setText("중지");

                                    //스레드를 생성해서 시작

                                    th = new Thread() {

                                            String[] images = {"heli1.png" ,"heli2.png","heli3.png"};//images[i%images.length]

                                            public void run() {

                                                   try {

                                                          int i = 0;

                                                          while(true) {

                                                                 //0.1초마다 대기

                                                                 Thread.sleep(100);

                                                                 //아이콘 생성

                                                                 icon = new ImageIcon("C:\\project\\JAVA_PROJECT\\java\\src\\java\\img\\"+(i%10)+".png");

                                                                 lbl.setIcon(icon);

                                                                 i += 1;

                                                          }

                                                   }catch (InterruptedException e) {

                                                          return ;

                                                   }

                                            }

                                    };

                                    th.start();

                                   

                                    break;

                             case "중지":

                                    btn.setText("시작");

                                    //스레드를 중지

                                    th.interrupt();

                                    break;

                             }

                      }

               };

               btn.addActionListener(listener);

               add(p);

              

               //Frame 기본 설정

               setTitle("이미지 레이블");

               setLocation(100, 100);

               setSize(1000, 1000);

               setVisible(true);

               //종료 기능 부여

               setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              

               //이미지 교체 애니메이션

               //현재는 코드가 진행이 안된다.

               /*String[] images = {"heli1.png" ,"heli2.png","heli3.png"};*/

               /*int i = 0;

               while(true) {

                      try {

                             Thread.sleep(50);

                             //icon = new ImageIcon("C:\\project\\JAVA_PROJECT\\java\\src\\java\\img\\"+(i%10)+".png");

                             icon = new ImageIcon("C:\\project\\JAVA_PROJECT\\java\\src\\java\\img\\heli"+(i%3)+".png");

                             lbl.setIcon(icon);

                             i = i+ 1;

                      } catch (InterruptedException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                      }

               }*/

               //시작하고 중지 스레드 interrupte걸어서

              

               /*for(int i = 0 ; i< 10; i++) {

                      try {

                             Thread.sleep(1000);

                             System.out.println(i);

                             //lbl.setText("레이블:"+i);

                            

                             icon = new ImageIcon("C:\\project\\JAVA_PROJECT\\java\\src\\java\\img\\"+i+".png");

                             //끝부분만 바꾸면 바꿀 있다.

                             lbl.setIcon(icon);

                            

                      } catch (InterruptedException e) {

                      }

               }*/

       }

}

 

 

5.JTextField

=> 줄의 문자열을 입력받기 위한 컴포넌트

=>현재 커서의 위치를 getCaretPosition으로 가져오고 setCaretPosition(int position)으로 설정

마우스 포인터를 cursor하는 경우도 있지만 caret이라고 하는 경우도 있습니다.

cursort 데이터를 단위로 하나씩 접근하는 포인터의 의미로도 사용

 

6.JPasswordField

=>비밀번호를 입력받기 위한 컴포넌트

=>보여지는 문자를 echoChar라고 합니다.

=>입력한 내용을 가져올 때는 getText deprecated 되서 getPassword 사용하는 것을 권장

 

 

7.JTextArea

=>여러 입력을 위한 컴포넌트

=> 바꿈 모드 설정을 위한 setLineWrap(boolean warp). setWrapStyle(boolean word):단어 단위 바꿈

 

8.JComboBox

=>콤보박스

=>여러 개의 항목 중에서 화면에 하나만 출력하고 하나만 선택할 있도록 해주는 컴포넌트

 

9. JList

=>리스트 또는 리스트 박스

=>여러 개의 항목 여러 개를 화면에 출력할 있고 여러 개를 선택하도록 있도록 해주는 컴포넌트

=>ComboBox JList 용도가  Radio CheckBox 같은데 항목이 많을 Radio CheckBox 영역을 너무 많이 차지 하기 때문에 이런 경우에는 comboBox List 사용

항목의 개수 때문에

 

 

10.JTable

=>테이블 모양으로 데이터를 출력하는 컴포넌트

1)생성자

JTable():비여있는 상태로 생성

JTable(int rows, int cols);행과 수를 지정해서 생성

JTable(TableModel model): 데이터 모델을 이용해서 생성 -MVC구현을 위해서 존재

 

2)데이터 출력

setValueAt(Object value, int row, int col):row col 해당하는 셀에 value toString 결과를 출력

 

setModel(TableModel model);테이블 모델을 만들어서 출력

 

3) DefaultTableModel

DefaultTableModel()

DefaultTableModel(int 행개수, int 열개수)

DefaultTableModel(Object [][]data, Object[] columnName):첫번째 매개변수는 셀에 출력할 데이터의 이차원배열이고 뒤의 데이터는 컬럼이름 배열

 

4)테이블 모델을 이용해서 데이터를 설정한 경우의 데이터 편집

addRow(Object[] data)

insertRow(int row,Object[] data)

moveRow(int start, int end, int to);start부터 end까지의 행을 to 위치로 이동

 

updateUI();다시 출력

 

5)테이블 모델을 이용하기를 권장하는 이유

=>JTable 출력하는 모양에만 관여를 하고 실제 데이터의 삽입과 삭제는 TableModel 관여

 

**Pane

=>특정 목적에만 이용하도록 만든 컴포넌트

1.JScrollPane

=>스크롤을 만들어주는 컴포넌트

 

2.JEditorPane

=>텍스트를 출력하기 이한 컴포넌트

=>TextArea 다른 점은 URL 연결해서 HTML 출력할 있고 RTF포맷도 출력이 가능

 

3.JTabbedPane

=>탭을 만들기 위한 컴포넌트

 

4)javax.swing.JOptionPane

=>메시지나 줄의 입력을 받기 위한 대화상자

1)MessageDialog

=>단순 메시지 출력을 위한 대화상자

=>JOptionPane.showMessageDialog() 이용해서 생성

 

2)ConfirmDialog

=>버튼을 2 이상 배치해서 생성한 버튼에 따라 다른 작업을 하고자 사용

=> JOptionPane.showConfirmDialog() 이용해서 생성

누른 버튼의 인덱스를 리턴합니다.

 

3)InputDialog

=>하나의 텍스트필드를 배치해서 줄의 텍스틀 입력받을 있는 대화상자

=> JOptionPane.showInputDialog() 이용해서 생성

확인 버튼을 누르면 입력한 내용이 String으로 리턴되고 취소버튼을 누르면 null 리턴됩니다.

입력한 내용이 없는데 확인을 누르면 null 아니고 "" 리턴됩니다.

 

 


showMessageDialog
(Component parentComponent, Object message, String title, int messageType, Icon icon)

Brings up a dialog displaying a message, specifying all parameters.

 

               //showMessageDialog(Component parentComponent, Object message, String title, int messageType, Icon icon)

               //단순한 메시지 출력 - 리턴값이 없습니다.

               //JOptionPane.showMessageDialog(this, "메시지","제목",JOptionPane.ERROR_MESSAGE);

               //ERROR_MESSAGE red

              

               //2 이상의 버튼을 배치해서 confirm 받는 메소드

               /*

               int result = JOptionPane.showConfirmDialog(this, "정말로 삭제","삭제",JOptionPane.YES_NO_CANCEL_OPTION);

               if(result == JOptionPane.YES_OPTION) {

                      JOptionPane.showMessageDialog(this, "yes","제목",JOptionPane.ERROR_MESSAGE);

               }else if(result == JOptionPane.NO_OPTION) {

                      JOptionPane.showMessageDialog(this, "no","제목",JOptionPane.ERROR_MESSAGE);

               }else {

                      JOptionPane.showMessageDialog(this, "cancel","제목",JOptionPane.ERROR_MESSAGE);

               }*/

              

               //한줄의 텍스트를 입력받는 대화상자를 출력

               //입력한 내용이 없는 상태에서 확인을 누르면 ""

               //

               String name = JOptionPane.showInputDialog(this,"이름을 입력하세요","");

               System.out.println(name);

 

**메뉴

=>JMenuBar, JMenu, JMenuItem(JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem)

=>메뉴에 setMnemonic(int 단축키) 설정하면 alt 조합해서 단축키로 사용 가능

응용프로그램을 만들 alt 포함해서 단축키를 만드는 것은 권장하지 않습니다.

미국에서 메뉴에 대한 단축키를 alt 사용한다.

ctrl 단독으로 많이사용한다.

 

**Stream

1.  입출력 Stream

2.  1.8에서 등장한 Map Reduce 프로그래밍일 위한 스트림 ->우리가 하는

 

 

 

반응형

'Study > Java' 카테고리의 다른 글

java-15  (1) 2020.10.05
java-14  (0) 2020.10.04
java-12  (0) 2020.10.02
java-11  (0) 2020.10.01
java-10  (0) 2020.09.30

+ Recent posts