보통 2개 의 테이블에서 조인을 하여 특정 테이블의 컬럼을 Update 하고 싶을 때, 대부분 SET 절에 SubQuery 형태로 문장을 작성하여, 특정값을 가져오게 하여 Update 하도록 많이 작성을 할 것입니다.

예를 들면 아래와 같은 문장이 되겠죠?

UPDATE TABLE_A A
   SET COLUMN_1 = (SELECT COLUMN_1 FROM TABLE_B B
                    WHERE B.KEY = A.KEY)

그럼 위의 문장과 같은 형식으로 table_a 에 두개 이상의 컬럼을 Update 한다고 생각하면, 

UPDATE table_a a
   SET column_1 = (SELECT column_1
                     FROM table_b b
                    WHERE b.KEY = a.KEY),
       column_2 = (SELECT column_2
                     FROM table_b b
                    WHERE b.KEY = a.KEY),
       column_3 = (SELECT column_3
                     FROM table_b b
                    WHERE b.KEY = a.KEY)

와 같은 식의 문장을 생각할 수 있습니다.

하지만, 아래와 같은 문장은 어떻게 될까요?

UPDATE
       (
        SELECT a.column_1 AS a_column_1,
               b.column_1 AS b_column_1
          FROM table_a a,
               table_b b
         WHERE a.KEY= b.KEY
       )
   SET a_column_1 = b_column_1

SQL문을 많이 접해보신 분이라면, 위 문장이 대략 어떤 의미인지 아실 수 있을 것 입니다.

즉, 위 문장과 같이 Updatable Join View 를 생각할 수 있습니다.

물론 이경우 조인되는 2개의 테이블은 반드시 1:1 또는 1:N의 관계여야 하며, Update되는 컬럼의 테이블은 N쪽 집합이어야 합니다.

이것은 1에 해당하는 집합인 부모 table의 조인 컬럼이 UK 또는 PK로 설정되어 있어야 된다는 것입니다.

위의 문장에서 보이는 table_a 와 table_b가 UK 또는 PK 로 설정이 되어 있지 않으면

ORA-01779 cannot modify a column which maps to a non key-preserved table

에러를 방생하며 실행되지 않습니다.

이쯤에서 한번 고민해봐야 할 문제가,

처음에 문제로 던졌던 두개의 Table을 조인하여, 특정 table의 컬럼 하나만 업데이트 할경우엔 Set 절에 Sub-Query 형태로 문장을 작성해도 큰 문제가 되지 않을 듯 합니다.

하지만, 컬럼이 여러개일 경우와 행이 무수히 많은 Table을 Update  할 경우 SET절에서 동일 문장으로 특정 테이블을 반복적으로 실행해야하는 로드가 발생하므로 Update 해야 하는 행이 많을 경우엔 Updatable Join View를 활용 해야만 하는 필요가 있다.

그러나, Updateable Join View 를 활용하기 위해 매번 테이블의 UK 혹은 PK를 생성해야만 해야 하나 라는 필요성에 대해 생각해 보게 되는데,  일반적으로는 UK나 PK Constraint를 설정하기 어려운 것이 현실입니다.

따라서, 이러한 Constraint를 피해서 Updatable Join View를 사용할 수 있도록 하기 위해 준비된 오라클 힌트가 있는데 그것이 바로,

BYPASS_UJVC 입니다.

즉, 위에서 소개한 문장에서 UK 혹은 PK가 설정되지 않아 에러가 리턴 될경우 아래와 같이 힌트를 준다면 정상적으로 실행이 될 것입니다.

UPDATE /*+ bypass_ujvc */
       (
        SELECT a.column_1 AS a_column_1,
               b.column_1 AS b_column_1
          FROM table_a a,
               table_b b
         WHERE a.KEY= b.KEY
       )
   SET a_column_1 = b_column_1

컬럼이 여러개 일 경우에도,

UPDATE /*+ bypass_ujvc */
       (
        SELECT a.column_1 AS a_column_1,
               b.column_1 AS b_column_1,
               a.column_2 AS a_column_2,
               b.column_2 AS b_column_2,
               a.column_3 AS a_column_3,
               b.column_3 AS b_column_3
          FROM table_a a,
               table_b b
         WHERE a.KEY= b.KEY
       )
   SET a_column_1 = b_column_1,
       a_column_2 = b_column_2,
       a_column_3 = b_column_3

위와 같이 표현될 수 있을 것 입니다.

이렇게 두개이상의 테이블을 조인하여 Update 할 경우 Updatable Join View 를 활용하여 Update 문을 실행하면, 실행시간도 단축(튜닝)되는 효과를 보실 수 있을 듯 합니다.

마지막으로 위에서 소개한 힌트의 의미를 풀어보자면

bypass_ujvc : Bypass Updateable Join view Constraints 이라는 의미 입니다.




'DBMS > 오라클기타' 카테고리의 다른 글

TYPE 오브젝트  (0) 2015.01.21
오라클 행을 열로  (0) 2014.12.17
순환구조  (0) 2013.06.24
25가지 SQL작성법  (0) 2013.06.09
테이블 정보 query  (0) 2013.06.06

 

재미있게 본 영화...간만에 끝가지 봤다.

 

 

 

 

 

 

 

 

 

 

 

 

'내가 본영화' 카테고리의 다른 글

세인트 빈센트(2015)  (0) 2015.02.22
월터의 상상은 현실이된다  (0) 2014.02.08
플립(flipped)  (0) 2014.01.29
화이  (0) 2014.01.29
어바웃 타임  (0) 2014.01.29

 

이클립스상에 UTF-8 설정>


메뉴 window

      - preference

         - web

            - CSS Files : Encoding --> IOS ..utf-8로 변경.( 맨위에 있는 설정 )

            - HTML Files: Encoding --> IOS ..utf-8로 변경.

            - JSP Files : Encoding --> IOS ..utf-8로 변경.


        - General

            - Content Type

                  - Text 

                     - Javascript Source File 밑에 Default encoding 에 UTF-8 로 UPDATE 하기.

 

 

'JAVA' 카테고리의 다른 글

Swing ( Ⅲ )  (0) 2014.09.13
Swing ( Ⅱ )  (0) 2014.09.13
Swing ( Ⅰ )  (0) 2014.09.13
내부클래스(inner class) / 로컬 내부 클래스 / static 내부 클래스 / 익명의 내부클래스 / url  (0) 2014.09.13
멀티 채팅 샘플  (0) 2014.09.13

 

1. JMenu



ex> Test01_JMenu.java


메뉴생성 및 메뉴의 책상을 누르면 해당 색상으로 바탕화면 변경.

package test02;

import java.awt.Color;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;


class MyFrame01 extends JFrame implements ActionListener{

    JMenuBar bar=new JMenuBar();

    JMenu menu1=new JMenu("파일");

    JMenu menu2=new JMenu("편집");

    JMenuItem item1=new JMenuItem("빨강");

    JMenuItem item2=new JMenuItem("파랑");

    JMenuItem item3=new JMenuItem("노랑");

    JMenuItem item4=new JMenuItem("종료");

    Container con;

    public MyFrame01(){

        con=getContentPane();

        

        //프레임에 메뉴바 붙이기

        setJMenuBar(bar);


        //메뉴바에 메뉴붙이기

        bar.add(menu1);

        bar.add(menu2);


        //메뉴에 하위메뉴(메뉴아이템)붙이기

        menu1.add(item1);

        menu1.add(item2);

        menu1.add(item3);

        menu1.add(item4);

        

        //메뉴아이템에 이벤트리스너 등록하기

        item1.addActionListener(this);

        item2.addActionListener(this);

        item3.addActionListener(this);

        item4.addActionListener(this);

        

        setSize(400,400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    @Override

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==item1){

            con.setBackground(Color.RED);

        }else if(e.getSource()==item2){

            con.setBackground(Color.BLUE);

        }else if(e.getSource()==item3){

            con.setBackground(Color.YELLOW);

        }else if(e.getSource()==item4){

            System.exit(0);

        }

    }

}

public class Test01_JMenu{

    public static void main(String[] args) {

        new MyFrame01();

    }

}

 


 

 






2. JList



ex> Test02_JList.java

package test02;

import java.awt.BorderLayout;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JList;

class MyFrame02 extends JFrame{

    JList<String> list;

    JComboBox<String> combo;


    public MyFrame02() {

        setLayout(new BorderLayout());

        

        String[] slist={"홍길동","김철수","이영희"};

        list=new JList<String>(slist);

        String[] part={"영업부","생산부"};

        combo=new JComboBox<String>(part);

        

        add(combo,BorderLayout.NORTH);

        add(list,BorderLayout.CENTER);

        

        setSize(400,400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class Test02_JList{

    public static void main(String[] args) {

        new MyFrame02();

    }

}


 


 





ex> Test03_JList.java

추가 버튼으로 입력한 내용을 추가한다. (삭제)

package test02;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import javax.swing.DefaultListModel;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JList;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextField;

class MyFrame03 extends JFrame implements ActionListener{

    JTextField txt=new JTextField(15);

    JButton btnAdd=new JButton("추가");

    JButton btnDel=new JButton("삭제");

    JPanel pan=new JPanel();

    JList<String> list;


    //JList와 연결될 모델객체 생성하기

    DefaultListModel<String> model=new DefaultListModel<>();


    public MyFrame03() {

        setLayout(new BorderLayout());

        pan.add(txt);

        pan.add(btnAdd);

        pan.add(btnDel);

        

        model.addElement("홍길동");

        model.addElement("홍길서");

        model.addElement("홍길남");

        model.addElement("홍길북");


        //모델객체와 연결된 JList생성하기

        list=new JList<String>(model);

        

        add(pan,BorderLayout.NORTH);

        add(new JScrollPane(list),BorderLayout.CENTER);

        

        btnAdd.addActionListener(this);

        btnDel.addActionListener(this);

        

        //텍스트필드에 키보드로 키값을 누를때마다 이를 감지하는 이벤트 리스너 등록

        txt.addKeyListener(new KeyAdapter(){

            public void keyPressed(KeyEvent e){

                //누른 키값 얻어오기

                int keyCode=e.getKeyCode();

                //누른 키가 엔터키인경우

                if(keyCode==KeyEvent.VK_ENTER){

                    addData();//입력된 문자열을 Model객체에 추가하기

                }

            }

        });

        setSize(400,400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        //추가버튼을 누른경우

        if(e.getSource()==btnAdd){

            addData();


        }else if(e.getSource()==btnDel){

        //삭제버튼을 누른 경우

            //선택된 인덱스번호 얻어오기

            int index=list.getSelectedIndex();

            //선택한 항목이 없는 경우

            if(index==-1){

                JOptionPane.showMessageDialog(this,"삭제할 항목을 선택하세요!");

                return;//메소드 끝내기

            }else{

                //선택한 항목 얻어오기

                String value=list.getSelectedValue();


                //부모컴포넌트, 보여줄메시지, 타이틀,  버튼형태

                int btn=JOptionPane.showConfirmDialog(this,

                        value+"님을 정말로 삭제할까요?",

                        "삭제",

                        JOptionPane.YES_NO_OPTION

                        );


                //아니오 버튼을 누른 경우

                if(btn==JOptionPane.NO_OPTION){

                    return;

                }

            }

            //해당 인덱스데이터를 Model에서 삭제하기

            model.remove(index);

        }

    }

    private void addData(){

        //입력된 문자열 얻어오기

        String str=txt.getText();


        //데이터 추가는 Model객체에 해야 함

        model.addElement(str);


        txt.setText("");

        txt.requestFocus();

    }

}

public class Test03_JList{

    public static void main(String[] args) {

        new MyFrame03();

    }

}


 


 





3. JTable



ex> Test04_JTable.java


package test02;

import java.awt.BorderLayout;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

class MyFrame04 extends JFrame{

    JTable tb;


    public MyFrame04() {

        setLayout(new BorderLayout());


        //JTable(Object[][] rowData, Object[] columnNames)

        String[][] rowData={

             {"홍길동","010-111-1234","경기도"},

             {"홍길서","010-222-3333","서울"},

             {"홍길남","010-333-4567","노원구"},

             {"홍길북","010-444-9876","경기도"}};

        String colNames[]={"이름","전화번호","주소"};


        //JTable생성

        tb=new JTable(rowData,colNames);

        

        //JTable을 Center영역에 붙이기

        add(new JScrollPane(tb),BorderLayout.CENTER);

        

        setSize(500,500);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class Test04_JTable{

    public static void main(String[] args) {

        new MyFrame04();

    }

}


 


 




ex> Test05_JTable.java


package test02;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.table.DefaultTableModel;


class MyFrame05 extends JFrame implements ActionListener{

    JTextField txtName=new JTextField(5);

    JTextField txtPhone=new JTextField(5);

    JTextField txtAddr=new JTextField(10);

    JPanel pan=new JPanel();

    JButton btnAdd=new JButton("추가");

    JButton btnDel=new JButton("삭제");

    JTable tb;

    DefaultTableModel model;


    public MyFrame05() {

        setLayout(new BorderLayout());

        pan.add(new JLabel("이름"));

        pan.add(txtName);

        pan.add(new JLabel("전화"));

        pan.add(txtPhone);

        pan.add(new JLabel("주소"));

        pan.add(txtAddr);

        pan.add(btnAdd);

        pan.add(btnDel);


        //public DefaultTableModel(Vector columnNames, int rowCount)

        //컬럼명을 Vector에 저장하기

        Vector<String> cols=new Vector<String>();

        cols.add("이름");

        cols.add("전화");

        cols.add("주소");


        //JTable과 연결될 모델객체 생성

        model=new DefaultTableModel(cols,0);


        //model객체와 연결되는 JTable생성

        tb=new JTable(model);

        

        add(pan,BorderLayout.NORTH);

        add(new JScrollPane(tb),BorderLayout.CENTER);

        

        //버튼에 이벤트리스너등록하기

        btnAdd.addActionListener(this);

        btnDel.addActionListener(this);

        

        setSize(500,500);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        // 추가버튼을 누른경우

        if(e.getSource()==btnAdd){

            //입력된 데이터 얻어오기

            String name=txtName.getText();

            String phone=txtPhone.getText();

            String addr=txtAddr.getText();

            

            //모델객체에 데이터 추가하기

            String []rows={name,phone,addr};

            model.addRow(rows);

        }else if(e.getSource()==btnDel){

            //선택한 행번호 얻어오기

            int index=tb.getSelectedRow();

            

            //선택한 행이 없는 경우

            if(index==-1){

                JOptionPane.showMessageDialog(this,"삭제할 회원 선택!");

                return;

            }

            //삭제는 Model객체에서 해야 함!

            model.removeRow(index);

        }

    }

}

public class Test05_JTable{

    public static void main(String[] args) {

        new MyFrame05();

    }

}

 

 

 

 






4. JDialog



ex> Test06_Dlg.java

로그인 버튼 - 로그인 팝업 창 오픈 - 아이디/비번 입력 체크

package test02;

import java.awt.FlowLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JTextField;


class MyFrame06 extends JFrame implements ActionListener{

    JButton btn1=new JButton("로그인");

    JLabel lbl=new JLabel();


    public MyFrame06() {

        setLayout(new FlowLayout());

        add(btn1);

        add(lbl);

        btn1.addActionListener(this);

        setSize(500,500);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        LoginDlg dlg=new LoginDlg(this);

        dlg.txtId.setText("admin");

    }

}

class LoginDlg extends JDialog implements ActionListener{

    MyFrame06 frm;

    JTextField txtId=new JTextField();

    JTextField txtPwd=new JTextField();

    JButton btnOk=new JButton("확인");

    JButton btnCancel=new JButton("취소");


    public LoginDlg(MyFrame06 frm){

        this.frm=frm;    

        setLayout(new GridLayout(3,2));

        add(new JLabel("아이디"));

        add(txtId);

        add(new JLabel("비밀번호"));

        add(txtPwd);

        add(btnOk);

        add(btnCancel);        

        btnOk.addActionListener(this);        

        setSize(200,120);

        setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        if(txtId.getText().equals("song") && txtPwd.getText().equals("1234")){

            frm.lbl.setText(txtId.getText()+"님 환영합니다.");


            //다이얼로그 닫기

            dispose();

        }else{

            JOptionPane.showMessageDialog(this,"아이디 또는 비밀번호가 틀려요!");

        }

    }

}

public class Test06_Dlg{

    public static void main(String[] args) {

        new MyFrame06();

    }

}

 

 


 


 


 

 

'JAVA' 카테고리의 다른 글

이클립스 UTF-8 설정  (0) 2014.09.13
Swing ( Ⅱ )  (0) 2014.09.13
Swing ( Ⅰ )  (0) 2014.09.13
내부클래스(inner class) / 로컬 내부 클래스 / static 내부 클래스 / 익명의 내부클래스 / url  (0) 2014.09.13
멀티 채팅 샘플  (0) 2014.09.13

 

1.


ex> Test01_Time.java

현재 시간을 thread로 구현해 보여준다. 

package test01.thread;

import java.awt.BorderLayout;

import java.util.Calendar;

import javax.swing.JFrame;

import javax.swing.JLabel;

class MyFrame01 extends JFrame{

    JLabel lbl=new JLabel("현재시각:");

    public MyFrame01() {

        setLayout(new BorderLayout());

        

        add(lbl,BorderLayout.NORTH);

        

        setSize(300,300);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        

        class TimeThread extends Thread{

            public void run(){

                while(true){

                    //현재시간에 대한 정보를 갖는 객체 얻어오기

                    Calendar cal=Calendar.getInstance();

                    //현재시간얻어오기

                    String str="현재시간:" +

                               cal.get(Calendar.HOUR_OF_DAY)+"시" +

                               cal.get(Calendar.MINUTE)+"분" +

                               cal.get(Calendar.SECOND)+"초";

                    //현재시간을 JLabel에 출력하기

                    lbl.setText(str);

                    try{

                        Thread.sleep(1000);

                    }catch(InterruptedException ue){

                        System.out.println(ue.getMessage());

                    }

                }

            }

        }

        //현재시간을 얻어와 lbl에 출력하는 스레드 실행하기

        TimeThread thread=new TimeThread();

        thread.start();

    }

}

public class Test01_Time{

    public static void main(String[] args) {

        new MyFrame01();

    }

}

 

 

 

 


 

2.

Runnable를 implements 하여 사용한 예>


ex>Test02_Time.java


package test01.thread;

import java.awt.BorderLayout;

import java.util.Calendar;

import javax.swing.JFrame;

import javax.swing.JLabel;

class MyFrame02 extends JFrame implements Runnable{

    JLabel lbl=new JLabel("현재시각:");

    public MyFrame02() {

        setLayout(new BorderLayout());

        

        add(lbl,BorderLayout.NORTH);

        

        setSize(300,300);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        

        //Runnable객체생성

        //Thread객체의 생성자인자로 Runnable넣기

        Thread th=new Thread(this);

        //start()호출

        th.start();

    }

    @Override

    public void run(){

        while(true){

            //현재시간에 대한 정보를 갖는 객체 얻어오기

            Calendar cal=Calendar.getInstance();

            //현재시간얻어오기

            String str="현재시간:" +

                       cal.get(Calendar.HOUR_OF_DAY)+"시" +

                       cal.get(Calendar.MINUTE)+"분" +

                       cal.get(Calendar.SECOND)+"초";

            //현재시간을 JLabel에 출력하기

            lbl.setText(str);

            try{

                Thread.sleep(1000);

            }catch(InterruptedException ue){

                System.out.println(ue.getMessage());

            }

        }

    }

}

public class Test02_Time{

    public static void main(String[] args) {

        new MyFrame02();

    }

}


 


 




3.



ex>  Test03_Time.java

날짜, 시간 보여주기

package test01.thread;

import java.awt.BorderLayout;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import javax.swing.JFrame;

import javax.swing.JLabel;

class TimeThread extends Thread{

    MyFrame03 frm;

    public TimeThread(MyFrame03 frm){

        this.frm=frm;

    }

    public void run(){

        while(true){

            Date d=new Date();

            //날짜의 출력형식을 지정할 수 있는 객체 생성

        //    SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

            SimpleDateFormat sd=new SimpleDateFormat("yyyy년MM월dd일");

            SimpleDateFormat st=new SimpleDateFormat("hh시mm분ss초");

            String strTime=st.format(d);

            String strDate=sd.format(d);

            //현재시간을 JLabel에 출력하기

            frm.lblTime.setText("현재시간:"+strTime);

            frm.lblDate.setText("오늘날짜:"+strDate);

            try{

                Thread.sleep(1000);

            }catch(InterruptedException ue){

                System.out.println(ue.getMessage());

            }

        }

    }

}

class MyFrame03 extends JFrame{

    JLabel lblTime=new JLabel("현재시각:");

    JLabel lblDate=new JLabel("오늘날짜:");

    public MyFrame03() {

        setLayout(new BorderLayout());    

        add(lblTime,BorderLayout.NORTH);

        add(lblDate,BorderLayout.SOUTH);        

        setSize(300,300);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        new TimeThread(this).start();

    }

}

public class Test03_Time {

    public static void main(String[] args) {

        new MyFrame03();

    }

}



 





4. 


ex> 이미지 3개 경주 게임.


package test01.thread;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Random;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

class MyFrame04 extends JFrame implements ActionListener{

    //이미지아이콘 객체 3개 생성하기

    JLabel img1=new JLabel(new ImageIcon("dog1.jpg"));

    JLabel img2=new JLabel(new ImageIcon("dog2.jpg"));

    JLabel img3=new JLabel(new ImageIcon("dog3.jpg"));

    JButton btn1=new JButton("출발");

    int rank=0;

    public MyFrame04() {

        //레이아웃매니져사용안하기

        setLayout(null);

        //이미지 x축좌표,y축좌표,가로길이,세로길이 설정하기

        img1.setBounds(10,50,50,50);

        img2.setBounds(10,110,50,50);

        img3.setBounds(10,170,50,50);

        //버튼 좌표와 크기 설정하기

        btn1.setBounds(10,250,100,30);

        //이미지와 버튼 프레임에 붙이기

        add(img1);

        add(img2);

        add(img3);

        add(btn1);

        

        //버튼에 이벤트리스너 등록하기

        btn1.addActionListener(this);

        

        setSize(700,400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        img1.setLocation(10,50);

        img2.setLocation(10,110);

        img3.setLocation(10,170);

        

        //이미지를 이동하는 스레드 실행하기

        new ImgMoveThread(img1).start();

        new ImgMoveThread(img2).start();

        new ImgMoveThread(img3).start();

    }

    class ImgMoveThread extends Thread{

        JLabel img;

        //생성자 인자로 이동시킬 이미지에 대한 참조값 얻어오기

        public ImgMoveThread(JLabel img){

            this.img=img;

        }    

        public void run(){

            Random rnd=new Random();

            while(true){

                //이동될 x좌표 구하기

                int moveX=img.getX()+rnd.nextInt(30);

                //이미지 이동시키기

                img.setLocation(moveX,img.getY());

                if(img.getX()>=600){

                    rank++;

                    img.setLocation(600,img.getY());

                    img.setToolTipText("등수:" + rank +"!!!");

                    break;

                }

                try{

                    Thread.sleep(200);

                }catch(InterruptedException ie){

                    System.out.println(ie.getMessage());

                }

            }

        }

    }

}

public class Test04_ImgMove{

    public static void main(String[] args) {

        new MyFrame04();

    }

}

 

 

 

 

'JAVA' 카테고리의 다른 글

이클립스 UTF-8 설정  (0) 2014.09.13
Swing ( Ⅲ )  (0) 2014.09.13
Swing ( Ⅰ )  (0) 2014.09.13
내부클래스(inner class) / 로컬 내부 클래스 / static 내부 클래스 / 익명의 내부클래스 / url  (0) 2014.09.13
멀티 채팅 샘플  (0) 2014.09.13

+ Recent posts