본문 바로가기
학원수업/12월

12/13 국비학원 자바수업 12회차(JTable, Static, 접근제한자)

by 코딩마스터^^ 2022. 12. 13.

테이블을 넣어보자!

JTable과 DefaultTableModel을 이용

package dev_java.address;
//목표 생성자 초기화 알기
//클래스를 쪼갰을때 스태틱을 사용하지 않고 생성자를 사용하기

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class AddressBook_dap implements ActionListener {

  //선언부
  AddressDialog adb =new AddressDialog();
  JFrame jf = new JFrame();
  JPanel jp = new JPanel();
  // JTable jt = new JTable();

  JButton jb[]=new JButton [4];
  String jb_label[]={"전체조회","입력","수정","상세보기"};//이름표 달아주기

  // JButton jb1 = new JButton("입력");
  // JButton jb2 = new JButton("조회");
  // JButton jb3 = new JButton("수정");
  // JButton jb4 = new JButton("상세보기");

  //BorderLayout중앙에 테이블 추가하기
  String[] header= {"번호","이름","H.P"};
  //JTable은 양식만 제공할뿐이고 데이터를 담을 클래스는 별도로 필요함
  String[][] datas= new String[3][3];
  //JTable에 들어갈 실제 데이터셋을 관리할 수 있는 클래스 선언함
  //JTable에 보여지는 실제 데이터는 디폴트모델클래스를 통해 제어해야함을 의미
  // DefaultTableModel dtm_addr=new DefaultTableModel(datas, header);
  DefaultTableModel dtm_addr= new DefaultTableModel(datas, header);
  //데이터셋을 JTable생성시 파라미터로 매칭하기
  JTable jt=new JTable(dtm_addr);
  //디폴트테이블모델의 로우 수가 많아지는 경우 스크롤패인을 추가해야된다.

  JScrollPane jsp_addr = new JScrollPane(jt, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  




  //생성자
  public AddressBook_dap(){
    initDisplay();
  }

  //화면처리부
  public void initDisplay(){
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//창닫기 버튼 클릭시 종료
    jf.setTitle("주소록 Ver1.0");
    jf.setSize(500,450);
    for(int i=0;i<jb.length;i++){
      jb[i]= new JButton(jb_label[i]);//버튼에 이름표/라벨을 달아줘야한다.*****
      // jb[i].setBounds(20,20,120,30);//버튼 붙이기 전에 해주기
      jp.add(jb[i]);//패널에 버튼을 붙임
      jb[i].addActionListener(this);//버튼에다가 액션리스너를 넣어줘야된다.****** 그리고 나를 넣어줘야된다.*****
      
    }
    //JPannel은 FlowLayout이 기본값인데 사용자의 정의 크기와 위치를 위해
    //레이아웃을 뭉갠다..???
    jp.setLayout(new FlowLayout(FlowLayout.LEFT, 10,20));//가로로 붙여주는 친구
    jf.add("North", jp);//북쪽으로 붙여주기
    jf.add("Center", jsp_addr);
    jf.setVisible(true);//****순서가 중요*** 다 추가하고 보이게 해야된다.
    
  

  }

  //메인메소드

  public static void main(String[] args) {
    new AddressBook_dap();
  }


  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj=e.getSource();
    if(obj==jb[0]){//전체조회-검색
      String members[][]={
        {"1","김도희","010-1234-5678"},
        {"2","이은재","010-4567-8912"},
        {"3","박소연","010-2345-6789"}
      };
      // dtm_addr.setDataVector(members, header);

      //이미 테이블에 조회된 정보가 있는경우 모두 삭제함
      // while(dtm_addr.getRowCount()>0){
      //   dtm_addr.removeRow(0);
      // }//없으면 밑에 추가가 된다.
      for(int i=0;i<members.length;i++){
        Vector<String> oneRow= new Vector<>();//<>제네릭
        oneRow.add(members[i][0]);
        oneRow.add(members[i][1]);
        oneRow.add(members[i][2]);
        dtm_addr.addRow(oneRow);     
      }
      jsp_addr.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener(){
        public void adjustmentValueChanged(AdjustmentEvent e){
          JScrollBar jsb = (JScrollBar)e.getSource();
          jsb.setValue(jsb.getMaximum());
        }
      }
      );

    }


    if(jb[1]==obj){
      // adb.jdg.setVisible(true);
      // adb.jdg.setTitle(jb_label[0]);//배열의 값를 가져와 "입력"
      adb.setDialog(jb_label[1], true);
    }
    if(jb[2]==obj){
      // adb.jdg.setVisible(true);
      // adb.jdg.setTitle(jb_label[1]);
      adb.setDialog(jb_label[2], true);
    }
    
    if(jb[3]==obj){
    //   adb.jdg.setVisible(true);
    //   adb.jdg.setTitle(jb_label[3]);
    adb.setDialog(jb_label[3], true);
    }

  }
  
}

 

JMenu

JMenuItem 을 사용해보자.

ToolBar

이벤트 처리 순서

 

1. 이벤트 소스(버튼, 체크박스, 텍스트필드)에 대응하는 인터페이스를 찾아라.

---->추상 메소드를 찾아서 재정의 해야된다.

 

2. 이벤트 소스와 이벤트 처리를 담당하는 핸들러클래스를 매칭함.

버튼.addActionListener(this);

 

implement actionListener

메소드 호출하기 파라미터넣기 이런것을 확실하게 알아야 한다.

화면구현이 중요한것이아니라

 

3. ActionPerformed 메소드 오버라이딩하기(재정의)

구현체 클래스가 있어야 한다.

ActionListener - 인터페이스. 추상메소드만 갖는다. 반드시 구현체 클래스가 있어야 한다. 

그래야 인스턴스화가 가능하다.

 

쓰레드는 그림자이다.

자동차에 달려있는 네비게이션

 

static

package dev_java.ch03.Practice;

class S1{
  static int i;//0. 전변의 성격. 글로벌하게 사용이 가능하다. 인스턴스화 없이 사용이 가능하다. 복제본 만들지 마라.
  static void m(){

  }
}
class S2{
  void n(){
    S1.i=500;
  }
}
public class StaticTest {

  public static void main(String[] args) {
    // insert here
    S1.i=10; //선언이 먼저다. 스태틱 전변이다. 타입+다트연산자로 할수있다. 인스턴스화 필요없다.
    S1 s1 = new S1();
    s1.i=100;//틀린거는 아니지만 쓰지 말아줄래...?
    System.out.println(S1.i);//100
    System.out.println(s1.i);//100 둘다 100이다. 왜? 스태틱은 원본이다. 하나를 바꾸면 원본을 바꾸는거다.
    S2 s2 = new S2();
    s2.n();//메소드 뒤에 ;이면 메소드 호출이다. n메소드 호출했니? 네. 경유했다.
    System.out.println("n()호출 후======>"+S1.i);//0? 10? 100? 500? 500이다.

  }
  
}
//접근제한자 private > friendly(같은 클래스 친구들만 쓸수있다) > protected(상속관계의 아빠는 쓰기 가능) > public
//static - 변수앞에,메소드앞에, 클래스앞에
//final-변수앞에(상수)-메소드앞에(오버라이딩 불가)-클래스 앞에(상속안됨- 자손못가짐)
 

연습할때 쉬운문제로 말해가면서 하나하나 만들어보자.

지역변수일때 내안에서 쓸수 없다. 파라미터로 값을 넘겨준다.

 

static안에서는 non-static은 그냥 안된다!!!!

자바에서는 같은 내용의 메소드를 여러개 만들 수 있다. 단, 파라미터의 갯수가 다르거나 타입이 다르면.

package dev_java.ch03.Practice;
//접근제한자 private > friendly(같은 클래스 친구들만 쓸수있다) > protected(상속관계의 아빠는 쓰기 가능) > public
//static - 변수앞에,메소드앞에, 클래스앞에
//final-변수앞에(상수)-메소드앞에(오버라이딩 불가)-클래스 앞에(상속안됨- 자손못가짐)

import java.util.Scanner;

public class Ellipse2 {
  //선언부- 전역변수는 초기화를 생략 가능하다. 왜냐하면 생성자가 해 주니까.
  double area=0.0;
  final double PI=3.14; // final재정의가 불가능하다. PI=2.5;//불가능하다. 

  //리턴타입을 결정할 수 있나요? 네- 메인에서 면적 출력할거니?
    //파라미터의 갯수와 타입도 선택 할 수 있니? 네
  double 면적구하기(int i1,int i2){//메인에서 출력할 때 double로 리턴타입을 결정. 메소드에서출력하려면 void로 리턴타입 결정.
    area=i1*i2*PI;//Int*double은 더블이 이긴다. 자동 형전환
    return 0.0;
    // return 3;//자동형전환
    // return (float)3.5; //강제 형전환
  }

  //자바에서는 같은 이름의 메소드를 중복 선언할 수 있다.
  //단, 파라미터의 갯수가 다르거나 타입이 달라야 한다.-메소드 오버로딩
  double 면적구하기(){
    return 0.0;
  }
  public static void main(String[] args) {
    Ellipse2 e2=new Ellipse2();
    
    int r1=0, r2=0;//반지름 2개 담을 변수 선언
    
    Scanner s = new Scanner(System.in);//인스턴스화-메모리에 로딩-메소드나 변수 누린다.
    System.out.print("첫번째 반지름 입력하세요");
    String user1=s.nextLine(); //호출. 구현이면 {}
    System.out.println("사용자가 입력한 첫번째 반지름은 ==="+user1);
    System.out.println("두번째 반지름을 입력하세요");
    String user2=s.nextLine();
    int i1=Integer.parseInt(user1); //첫번째 반지름을 원시형으로 바꿈 왜? 곱셈해야되니까.
    int i2=Integer.parseInt(user2); //두번째 반지름을 원시형으로 바꿈 왜? 곱셈해야되니까.
    
    e2.면적구하기(i1,i2);//파라미터로 값을 넘겨준다******
    System.out.println("타원형의 면적은"+e2.area+"입니다."); //Ellipse.area는 안된다.  area가 스태틱이 아니니까. 스태틱=공유=하나
    
  }
    
  }

댓글