//로컬 inner 클래스

//로컬클래스를 생성하는 메소드를 외부클래스에서 만든다

//그안에 로컬클래스를 작성하고 작성과 동시에 기능을할 코드작성

//메소드 리턴값으로 로컬클래스 생성자를 리턴한다.

//main부분에서 생성할때 외부클래스 . 로컬클래스로 쓸수있는것이다.



interface Readable {

public void read();

}


class OuterClass1 {

private String myName;


OuterClass1(String name) {

myName = name;

}


public Readable createLocalClassInst() {

class LocalClass implements Readable {

public void read() {

System.out.println("Outer inst name: " + myName);

}

}


return new LocalClass();

}

}


class LocalClassTest {

public static void main(String[] args) {

Readable out1 = new OuterClass1("First").createLocalClassInst();

out1.read();


Readable out2 = new OuterClass1("Second").createLocalClassInst();

out2.read();

}

}

블로그 이미지

왕왕왕왕

,

class OuterClass {

private static String myName;

private static int num;


OuterClass(String name) {

myName = name;

num = 0;

}


static class StaticInnerClass {

public StaticInnerClass(String name) {

// TODO Auto-generated constructor stub

myName = name;

num = 0;

}


public void inner() {

num++;

System.out.println(myName + " OuterClass " + num);

}


}


class InnerClassTest {

public static void main(String[] args) {

// static

StaticInnerClass staticin1 = new StaticInnerClass("First");

StaticInnerClass staticin2 = new StaticInnerClass("Second");

staticin1.inner();

staticin2.inner();


}

}

블로그 이미지

왕왕왕왕

,

instance inner 클래스 

inner클래스에 외부 클래스 필드를 자유롭게 사용가능하다

외부클래스를 통해 생성해야된다. (new 외부클래스. new inner클래스;)


class OuterClass {

private String myName;

private int num;


OuterClass(String name) {

myName = name;

num = 0;

}


class InnerClass {

InnerClass() {

}


public void inner() {

num++;

System.out.println(myName + " OuterClass " + num);

}

}

}


class InnerClassTest {

public static void main(String[] args) {

// OuterClass.InnerClass in1 = new OuterClass("First").new InnerClass();

// OuterClass.InnerClass in2 = new OuterClass("Second").new InnerClass();

// in1.inner();

// in2.inner();

블로그 이미지

왕왕왕왕

,


//도형 추상클래스 예제

//Area라는 추상클래스가 super 클래스가 됨

//도형별클래스마다 Area를 상속

//Area를 레퍼런스로 각 도형클래스 생성하여 원하는 도형을 출력


public class test {


public static void main(String[] args) {

// TODO Auto-generated method stub

Area parent_Rect = new Rect();

Area parent_Tri = new Tri();

Area parent_Cir = new Cir();


Scanner i = new Scanner(System.in);

System.out.println("1.사각형 2.삼각형 3.원");


int num = i.nextInt();


if (num == 1) {

parent_Rect.disp();

} else if (num == 2) {

parent_Tri.disp();

} else if (num == 3) {

parent_Cir.disp();

} else {

System.out.println("아무것도없음");

}

}

}


abstract class Area {

public abstract void disp();

}


class Rect extends Area {


@Override

public void disp() {

// TODO Auto-generated method stub

System.out.println("사각형");

}

}


class Tri extends Area {


@Override

public void disp() {

// TODO Auto-generated method stub

System.out.println("삼각형");

}

}


class Cir extends Area {


@Override

public void disp() {

// TODO Auto-generated method stub

System.out.println("원");

}

}


추상클래스 


상속을 목적으로 쓴다.

추상메소드는 강제성이있다.

상속받은 클래스에서 추상메소드를 오버라이딩 해줘야 객체생성 할 수 있다.

동적바인딩으로 코드를 짜게되면 간결해질 수 있다.




블로그 이미지

왕왕왕왕

,

//sql 은select * from test

//전체 레코드는 10개이고 컬럼은 6개인 테이블이다.


ResultSet re = stmt.executeQuery(sql);

//메타데이터를 얻고 그 메타데이터에서 컬럼개수를 반환한다.

//컬럼개수 6개 나옴

ResultSetMetaData md = re.getMetaData() ;

int column = md.getColumnCount();


//행의 맨마지막으로가서 Row를 반환하고 다시 처음으로 돌려놓는다.

//레코드 개수 10개 나옴

re.last();

int row = re.getRow(); 

re.beforeFirst();



//이렇게하는이유는 배열을 이용해 데이터를 한번에 가져올때 쓰면좋을거같다.

//동적할당을 위해

블로그 이미지

왕왕왕왕

,


//컬럼명을 만들어준다.

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

column1.addElement("제품명");

column1.addElement("제품수량");

column1.addElement("제품가격");

column1.addElement("등록기간");

column1.addElement("유통기한");

//추가한 컬럼명으로 모델 생성하고 인자로 넣어줌

DefaultTableModel model = new DefaultTableModel(column1, 0);


 제품명,제품수량,제품가격,등록기간,유통기한 컬럼을 가진 테이블이 만들어진다.

 0은 비어있는 행을 추가하느냐 마느냐. 1로하면 아무것도 작성되지않은 행이 1개추가되서  테이블생성 필요없어서 0으로함


//이제 데이터를 넣을 거다.

//컬럼이 5개 만들어져서 5개에 데이터를 넣는다. 아무리 더추가해봤자 안들어감


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

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

model.addRow(row);


//추가된 데이터들을 모델에 추가하고 모델을 테이블 인자로 넣어준다.


table = new JTable(model);

scrollPane.setViewportView(table);


//여기까지 하면 1행이 추가되면 컬럼별로 dd라는 데이터를 가지게된다.

//이벤트 발생시마다 추가하고싶다면


//생성을 같은이름으로 생성해주고 

//데이터를 넣고 모델에 추가해주면 바로 2행으로 추가된다.

//아래 코드만 반복적으로 사용하면 실시간으로 테이블에 추가가능 하겠다.

row = new Vector<String>();

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

row.addElement("dd");

model.addRow(row);


JTable에 들어가는 인자로는 TableModel dm이나,

Object[][] rowdata,Object[] columnName,

Vector rowData, Vector columnName,


이외에도 몇개있음 아무튼 이렇게도 테이블 생성할 수 있다는 것만 알고 있으면된다.




1차원과 2차원 배열을 이용해 할 수 도 있지만, 이게더 효율적으로 보인다.

2차원은 아무래도 코드가 지저분해지니까 ㄴㄴ


블로그 이미지

왕왕왕왕

,

텍스트 필드를 JFormattedTextField로 생성


try {

MaskFormatter format = new MaskFormatter("####-##-##");

sheif_Life_TextField = new JFormattedTextField(format);

sheif_Life_TextField.setBounds(100, 55, 116, 21);

stock_contentPane.add(sheif_Life_TextField);

sheif_Life_TextField.setColumns(10);

} catch (ParseException e1) {

// TODO 자동 생성된 catch 블록

e1.printStackTrace();

}


MaskFormatter로 형식을 지정해주고 실행해보면


텍스트필드에 - - 이렇게만적혀있다.


그냥 연도,월,일 순으로 20000101입력한다면


2000-01-01 이렇게 완성된다.


자신이 정한 포맷형식을 벗어나지않는다


2000010101 입력이 안된다는 말이다.



블로그 이미지

왕왕왕왕

,

comboBox.addItemListener(new ItemListener() {

public void itemStateChanged(ItemEvent e) {

Object a = e.getItem();

textField.setText(String.valueOf(a));

}

});


간단하다. 아이템 변경될때마다 이벤트를 getitem 하면서 텍스트필드에 찍어 볼 수 있다.

블로그 이미지

왕왕왕왕

,