본문 바로가기

java

Step15_Thread (심화 예제)

 

 

Frame07Me (필자 작성 코드)

package test.main;

import java.awt.BorderLayout;
import java.awt.Color;
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.JPanel;
import javax.swing.JTextField;

public class Frame07Me extends JFrame  implements ActionListener{
	//필드
	JTextField tf_num;
	
	//생성자
	public Frame07Me () {
		setLayout(new BorderLayout());
		
		//JPanel
	    JPanel topPanel=new JPanel();
	    topPanel.setBackground(Color.blue);
	    //Panel 을 북쪽에 배치하기 
	    add(topPanel, BorderLayout.NORTH);
	    
	    //JTextField 객체를 만들에서 JPanel 에 추가하기 
	    tf_num=new JTextField(10);
	    topPanel.add(tf_num);
	    //기능 버튼 객체를 만들어서 JPanel 에 추가하기
	    JButton MyBtn=new JButton("실행하기");
	    topPanel.add(MyBtn);
	    
	    //버튼에 액션 리스너 등록
	    MyBtn.addActionListener(this);
	}
	public static void main(String[] args) {
	      
		  Frame07Me frame=new Frame07Me();
	      //프레임의 제목 설정
	      frame.setTitle("계산기");
	      //프레임을 닫으면 자동으로 프로세스가 종료 되도록 한다.
	      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      frame.setBounds(100, 100, 500, 500);
	      frame.setVisible(true);
	   }
	@Override
	public void actionPerformed(ActionEvent e) {
		String strNum1=tf_num.getText();
		try {
			int num1=Integer.parseInt(strNum1);
			new Thread(new Runnable() {
				@Override
				public void run() {
					  //run 메소드 안쪽이 새로운 작업 단위가 된다.
				      int count=0;
				      while(true) {
				         try {
				            Thread.sleep(1000);
				         } catch (InterruptedException e) {
				            e.printStackTrace();
				         }
				         count++;
				         int result=num1*count;
				         System.out.println(num1+" x "+count+" = "+result);
				         if(count==9) {
				            break;
				         }
				      }
				}
		     }).start();
		}catch(NumberFormatException nfe) {
	         JOptionPane.showMessageDialog(this, "숫자 형식으로 입력하세요");
	    }
	}

}

 

Frame07 (선생님 작성 코드)

package test.main;

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;

public class Frame07 extends JFrame implements ActionListener{
   JTextField tf;
   //생성자 
   public Frame07(String title) {
      super(title);
      //레이아웃 설정
      setLayout(new FlowLayout());
      
      this.tf=new JTextField(10);
      JButton printBtn=new JButton("출력하기");
      
      add(tf);
      add(printBtn);
      
      //버튼에 리스너 등록
      printBtn.addActionListener(this);
   }
   
   @Override
   public void actionPerformed(ActionEvent e) {
      //main 스레드에서는 새로운 스레드를 시작만 시키고 
      new Thread(()->{
         //입력한 문자열을 읽어온다.
         String inputNum=tf.getText();
         //입력한 숫자형태의 문자열을 실제 정수로 바꾸기
         int num=Integer.parseInt(inputNum);
         for(int i=0; i<9; i++) {
            //1초씩 지연시키기
            try {
               Thread.sleep(1000);
            } catch (InterruptedException e1) {
               e1.printStackTrace();
            }
            int result=num*(i+1);
            System.out.println(num+" x "+(i+1)+" = "+result);
         }
      }).start();
      //바로 리턴한다. 
      System.out.println("actionPerformed() 메소드가 리턴됩니다.");
   }
   
   public static void main(String[] args) {
      JFrame frame=new Frame07("구구단 예제");
      //프레임을 닫으면 자동으로 프로세스가 종료 되도록 한다.
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setBounds(100, 100, 500, 500);
      frame.setVisible(true);
   }
}

 

숫자를 입력하고 출력하기 버튼을 누르면 구구단을 출력하는 심화 예제이다. 지금까지 배운 것들을 다수 활용해야 한다.