김미썸코딩

12/10 - GUI(3) : JSpinner, JComboBox, JList, JTable, JTree 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

12/10 - GUI(3) : JSpinner, JComboBox, JList, JTable, JTree

김미썸 2020. 12. 10. 23:23
728x90

* 보기 좋은 떡이 먹기도 좋다!!

GUI Project

 

기획 :

 

1. Architecture(팀장급 회의)

 

- 객체 모델링

     UML

         starUML ...

- 데이터 모델링

     ERD

         eXERD ...

- 디자인 기획(UI/UX)

     스토리 보드(Mockup : Wireframe) - sketch

         powermockup

 

1. Container

2. LayoutManager(Null(Absolute) Layout)

3. Widget(Component)

4. 이벤트

           1. 마우스 클릭

           2. ItemStateChanged

 

* DAO / TO (객체중심 ) 중요

JCheckBox / JRadioButton

JOptionPane

JProgressBar

JSlider

(데이터를 갖지 않음)

 

데이터를 포함 할 수 있는 Widget

클래스

           M(odel)       : 데이터

           V(iew)        : 디자인

 

 


 

 

 

 

1. JSpinner

JSpinnerEx01.java

model(list, number, date)에 데이터를 넣는다. (object가 됨)

  • list - SpinnerListModel
  • number - SpinnerNumberModel
  • date - SpinnerDateModel

 

JSpinner는 ui이고 setModel메서드로 SPSpinnerListModel로 데이터를 넣는다.

한글은 한글에 대한 유니코드로 들어간다. ex) "사과" -> "\uC0AC\uACFC" (그냥 코드에 바로 "사과" 넣어도 됨)

 

1) 데이터 넣기

(1) 이렇게 한번에 써도 되고

spinner.setModel(new SpinnerListModel(new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"}));

 

(2) 나눠서 써도 된다.

String[] items = new String[] {"사과","딸기","수박","참외"};
SpinnerListModel spinnerListModel = new SpinnerListModel(items);
spinner.setModel(spinnerListModel);

 

(3) 사용자 정의 클래스 사용해도 된다. (UserSpinnerListModel.java)

새로운 클래스 만들때 spinnerListModel을 superclass로 추가 필수

다음과 같이 클래스를 따로 정의하고 

import javax.swing.SpinnerListModel;

public class UserSpinnerListModel extends SpinnerListModel {
	String[] items = new String[] {"사과","딸기","수박","참외"};

	public SpinnerListModel getValues(){
		SpinnerListModel spinnerListModel = new SpinnerListModel(items);
		return spinnerListModel;
	}
}

아래와 같이 getValues()로 호출한다.

spinner.setModel(new UserSpinnerListModel().getValues());

 

2) 값 가져오기

버튼으로 값을 가져올때 원래 하던대로 

String value = spinner.getValue();

이렇게 하면 object가 들어가서 에러가 난다. 

따라서 아래처럼 해줘야한다.

String value = (String)spinner.getValue();

 

3) 값이 변할 때마다 값 가져오기

버튼 필요X

stateChange사용하면된다.

spinner.addChangeListener(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        String value = (String)spinner.getValue();
        System.out.println(value);
    }
});

버튼보다 이걸더 많이 쓴다.

 

 

 

2. JComboBox

JComboBoxEx01.java

model에 데이터를 넣는다. (object가 됨)

 

1) 데이터 넣기 / 가져오기

selectedIndex 

0번이 첫번째 아이템이 된다.

이걸로 선택된 아이템을 알수 있다.

아무것도 선택되지 않았으면 -1이다.

 

(1) 버튼을 사용해서 값 넣고 가져오기

selectedIndex를 가져온 후에 가져오는게 좋다.

System.out.println(comboBox.getSelectedIndex());
System.out.println((String)comboBox.getSelectedItem());

(2) 사용자 정의 함수 사용 (CustomComboBoxModel.java)

새로운 클래스 만들때 DefaultComboBoxModel를 superclass로 추가 필수

import javax.swing.DefaultComboBoxModel;

public class CustomComboBoxModel extends DefaultComboBoxModel<Object> {
	private String[] datas1 = new String[] {"사과","딸기","수박","참외"};
	
	// callback - combobox 자동으로 불리워지는 메서드
	public int getSize() {
		System.out.println("getSize() 호출");
		return datas1.length;
	}
	
	public Object getElement(int index) {
		System.out.println("getElementAt() 호출");
		return datas1[index];
	}
}
comboBox.setModel(new CustomComboBoxModel());

 

버튼 사용 말고 콤보박스내에서 이벤트를 주는 것도 가능하다.

콤보박스에서 아이템을 선택했을 때 '선택됨'이 콘솔창에 출력되게 하기

itemStateChange 사용

근데 여기서 원래대로 아래처럼 코드를 작성하면 '선택됨'이 두개씩 출력된다. 

comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent e) {
        System.out.println("선택됨");
    }
});

하나씩 출력되게 하려면

comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED) {
            System.out.println("선택됨");
        }
    }
});

위처럼 if 문을 추가해줘야한다. 이 if문은 거의 외우다시피 해야한다.

 

 

 

3. JList

selection multi_selected복수선택이 가능 (ctrl키 사용해야함)

selection에서 single_selected로 설정 변경 해주는게 낫다.

데이터가 리스트 화면 크기보다 더 많으면 잘려서 안나옴 (scrollPane 해줘야함)

 

scrollPane은 horizontalScrollBarPolicy에서 설정을 정해줄수 있다.

 

(1) 자동으로 되어 있던 방식

list.setModel(new AbstractListModel() {
    String[] values = new String[] {"사과", "딸기", "수박", "참외"};
    public int getSize() {
        return values.length;
    }
    public Object getElementAt(int index) {
        return values[index];
    }
});

 

(2) 사용자 정의 함수 (CustomListModel.java)

AbstractListModel를 superclass로 추가 필수 

import javax.swing.AbstractListModel;

public class CustomListModel extends AbstractListModel<String> {
	private String[] values = new String[] {"사과","딸기","수박","참외"};
	
	@Override
	public String getElementAt(int index) {
		return values[index];
	}

	@Override
	public int getSize() {
		return values.length;
	}

}
list.setModel(new CustomListModel());

 

 

 

 

 

실습1) 동이름입력받아서 주소 출력

입력받은 동에 해당하는 주소들을 ArrayList<String>에 담아서 객체로 만드는 것이 포인트!

(1) 내가 한거 (강사님과 동일)

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;

import model1.CustomListModel;

import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;

public class ZipcodeSearchUI05 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JList list;
	private JTextField textField1;
	private JTextField textField2;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ZipcodeSearchUI05 frame = new ZipcodeSearchUI05();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI05() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 650, 613);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\uC6B0\uD3B8\uBC88\uD638\uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 21, 616, 73);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lbl = new JLabel("동이름");
		lbl.setBounds(12, 41, 57, 15);
		panel.add(lbl);
		
		textField = new JTextField();
		textField.setBounds(67, 38, 428, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		JButton btn = new JButton("검색");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// 초기화 작업
				
				try {
					String strDong = textField.getText();
					
					if(list != null) {
						list.setModel( new CustomListModel(strDong));
					}
				} catch (ClassNotFoundException e1) {
					System.out.println("[에러]" + e1.getMessage());
				} catch (SQLException e1) {
					System.out.println("[에러]" + e1.getMessage());
				} catch (NullPointerException e1) {
					System.out.println("[에러]" + e1.getMessage());
				}
				
			}
		});
		btn.setBounds(507, 37, 97, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setBounds(10, 111, 612, 380);
		contentPane.add(scrollPane);
		
		list = new JList();
		list.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				textField1.setText((String)list.getSelectedValue());
			}
		});
		scrollPane.setViewportView(list);
		
		textField1 = new JTextField();
		textField1.setEditable(false);
		textField1.setText("기본주소");
		textField1.setBounds(12, 512, 610, 21);
		contentPane.add(textField1);
		textField1.setColumns(10);
		
		textField2 = new JTextField();
		textField2.setText("상세주소");
		textField2.setBounds(12, 543, 610, 21);
		contentPane.add(textField2);
		textField2.setColumns(10);
	}
}
package model1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.AbstractListModel;

public class CustomListModel extends AbstractListModel<String> {
	private ArrayList<String> values = new ArrayList<String>();
	private Connection conn = null;
	
	public CustomListModel() throws ClassNotFoundException, SQLException{
		
	}

	public CustomListModel(String strDong) throws ClassNotFoundException, SQLException, NullPointerException{
		
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		Class.forName("org.mariadb.jdbc.Driver");
		this.conn = DriverManager.getConnection(url, user, password);
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji, seq from zipcode where dong like ?";
	
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, strDong + "%");
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next()) {
			String zipcode = rs.getString("zipcode");
			String sido = rs.getString("sido");
			String gugun = rs.getString("gugun");
			String dong = rs.getString("dong");
			String ri = rs.getString("ri");
			String bunji = rs.getString("bunji");
				
			values.add(String.format("[%s] %s %s %s %s %s\n", zipcode, sido , gugun, dong, ri, bunji));
		}

	}
	
	@Override
	public String getElementAt(int index) {
		// TODO Auto-generated method stub
		return values.get(index);
	}

	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return values.size();
	}

}

 

(2) DAO / TO 로 구현하기

- 버튼클릭했을 때 메서드   *(1) 과 동일

btn.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        // 초기화 작업

        try {
            if(list != null) {
                String strDong = textField.getText();
                list.setModel( new ZipcodeListModel2(strDong));
            }
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
});

- 리스트에서 주소 클릭했을 때 [기본 주소] 대신 클릭한 주소가 나오게 하기  *(1) 과 동일

list.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        textField1.setText((String)list.getSelectedValue());
    }
});

 

- 주소 리스트 모델링

package model1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.AbstractListModel;

public class ZipcodeListModel2 extends AbstractListModel<String> {
	private ArrayList<ZipcodeTO> values;
	
	public ZipcodeListModel2() {
		
	}

	public ZipcodeListModel2(String strDong) throws ClassNotFoundException, SQLException{
		ZipcodeDAO dao = new ZipcodeDAO();
		values = dao.searchZipcode(strDong);
		
	}
	
	@Override
	public String getElementAt(int index) {
		ZipcodeTO value = values.get(index);
		String address = String.format("[%s] %s %s %s %s %s\n", value.getZipcode(), value.getSido(), value.getGugun(),
				value.getDong(), value.getRi(), value.getBunji());
		return address;
	}

	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return values.size();
	}

}

- DAO

package model1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ZipcodeDAO {
	
	private Connection conn = null;
	
	// 생성자
	// 데이터베이스 접속 
	public ZipcodeDAO() throws ClassNotFoundException, SQLException{
		
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		Class.forName("org.mariadb.jdbc.Driver");
		this.conn = DriverManager.getConnection(url, user, password);
		// Connection conn = DriverManager.getConnection(url, user, password);
	}
	
	// SQL 구문별 메소드  - 동이름과 함께 호출되는 메서드는 그 결과값을 ArrayList<ZipcodeTO>로 리턴
	public ArrayList<ZipcodeTO> searchZipcode(String strDong) throws ClassNotFoundException, SQLException{
		ArrayList<ZipcodeTO> result = new ArrayList<ZipcodeTO>();
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji, seq from zipcode where dong like ?";
	
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, strDong + "%");
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next()) {
			// 생성자 사용
			/*
			String zipcode = rs.getString("zipcode");
			String sido = rs.getString("sido");
			String gugun = rs.getString("gugun");
			String dong = rs.getString("dong");
			String ri = rs.getString("ri");
			String bunji = rs.getString("bunji");
			String seq = rs.getString("seq");
			
			ZipcodeTO to = new ZipcodeTO(zipcode, sido, gugun, dong, ri, bunji, seq);
			*/
			
			// setter 사용
			ZipcodeTO to = new ZipcodeTO();
			to.setZipcode(rs.getString("zipcode"));
			to.setSido(rs.getString("sido"));
			to.setGugun(rs.getString("gugun"));
			to.setDong(rs.getString("dong"));
			to.setRi(rs.getString("ri"));
			to.setBunji(rs.getString("bunji"));
			
			result.add(to);
		}
		
		return result;
	}

}

- DTO

package model1;

public class ZipcodeTO {
	// DAO로 받아온 값들을 조작할 수 있게 선언
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	private String seq;
	
	// 생성자  - setter
	/*
	public ZipcodeTO(String zipcode, String sido, String gugun, String dong, String ri, String bunji, String seq){
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
		this.seq = seq;
	}
	*/
	
	// setter
	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getSido() {
		return sido;
	}

	public void setSido(String sido) {
		this.sido = sido;
	}

	public String getGugun() {
		return gugun;
	}

	public void setGugun(String gugun) {
		this.gugun = gugun;
	}

	// getter
	public String getDong() {
		return dong;
	}

	public void setDong(String dong) {
		this.dong = dong;
	}

	public String getRi() {
		return ri;
	}

	public void setRi(String ri) {
		this.ri = ri;
	}

	public String getBunji() {
		return bunji;
	}

	public void setBunji(String bunji) {
		this.bunji = bunji;
	}

	public String getSeq() {
		return seq;
	}

	public void setSeq(String seq) {
		this.seq = seq;
	}
	
	
	
	
}

 

 

(3) 추가로  2자 이상 입력으로 조건걸기

if(list != null) {
    String strDong = textField.getText();
    if(strDong.length() < 2) {
        JOptionPane.showMessageDialog(ZipcodeSearchUI05.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
    }else {

        list.setModel( new ZipcodeListModel2(strDong));
    }
}

 

 

 

 

 

 

 

4. JTable 

가장 복잡한 것 중 하나!

JTableEx01.java

model 사용

enable은 false 시켜서 read only 만들어도된다.

 

 

 

사용자 정의 함수로 빼내기 (CustomTableModel.java)

extends AbstractTableModel 해줘야함

 

(1) 일반 사용자 정의 함수 사용

import javax.swing.table.AbstractTableModel;

public class CustomTableModel extends AbstractTableModel {
	// 2차원 배열 / ArrayList<ArrayList> / ArrayList<TO>
	private String[][] datas = new String[][] {
		{"11","12","13","14"},
		{"21","22","23","24"},
		{"31","32","33","34"},
	};

	@Override
	public int getColumnCount() {
		// 컬럼의 갯수 / 모두 대칭이므로 인덱스 0 걸로 불러와도됨
		return datas[0].length;
	}

	@Override
	public int getRowCount() {
		// 데이터의 갯수
		return datas.length;
	}

	@Override
	public Object getValueAt(int rosIndex, int columnIndex) {
		return datas[rosIndex][columnIndex];
	}

}
table.setModel(new CustomTableModel());

 

(2) ArrayList<ArrayList> 사용

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class CustomTableModel extends AbstractTableModel {
	// 2차원 배열 / ArrayList<ArrayList> / ArrayList<TO>
	private String[][] datas = new String[][] {
		{"11","12","13","14"},
		{"21","22","23","24"},
		{"31","32","33","34"},
	};
	
	ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
	
	public CustomTableModel() {
		ArrayList<String> data1 = new ArrayList<String>();
		data1.add("11"); data1.add("12"); data1.add("13"); data1.add("14");
		ArrayList<String> data2 = new ArrayList<String>();
		data2.add("21"); data2.add("22"); data2.add("23"); data2.add("24");
		ArrayList<String> data3 = new ArrayList<String>();
		data3.add("31"); data3.add("32"); data3.add("33"); data3.add("34");
		
		datas2.add(data1);
		datas2.add(data2);
		datas2.add(data3);
	}
	

	@Override
	public int getColumnCount() {
		// 컬럼의 갯수 / 모두 대칭이므로 인덱스 0 걸로 불러와도됨
		return datas2.get(0).size();
	}

	@Override
	public int getRowCount() {
		// 데이터의 갯수
		return datas2.size();
	}

	@Override
	public Object getValueAt(int rosIndex, int columnIndex) {
		return datas2.get(rosIndex).get(columnIndex);
	}

}

 

(2) ArrayList<TableTO> 사용

 

public class TableTO {
	private String col1;
	private String col2;
	private String col3;
	private String col4;
	
	public TableTO(String col1, String col2, String col3, String col4) {
		this.col1 = col1;
		this.col2 = col2;
		this.col3 = col3;
		this.col4 = col4;
	}

	public String getCol1() {
		return col1;
	}

	public String getCol2() {
		return col2;
	}

	public String getCol3() {
		return col3;
	}

	public String getCol4() {
		return col4;
	}
	
	
	
}
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class CustomTableModel2 extends AbstractTableModel {
	
	private ArrayList<TableTO> datas;
	
	//ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
	 
	public CustomTableModel2() {
		TableTO to1 = new TableTO("11","12","13","14");
		TableTO to2 = new TableTO("21","22","23","24");
		TableTO to3 = new TableTO("31","32","33","34");
		
		datas = new ArrayList<TableTO>();
		datas.add(to1);
		datas.add(to2);
		datas.add(to3);
	}
	

	@Override
	public int getColumnCount() {
		// 컬럼의 갯수 / 안에서 가져오기 어려워서 그냥 정해줌
		return 4;
	}

	@Override
	public int getRowCount() {
		// 데이터의 갯수
		return datas.size();
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		String result = "";
		TableTO to = datas.get(rowIndex);
		switch(columnIndex) {
		case 0 :
			result = to.getCol1();
			break;
		case 1 :
			result = to.getCol2();
			break;
		case 2 :
			result = to.getCol3();
			break;
		case 3 :
			result = to.getCol4();
			break;
		default :
		}
		return result;
	}

}
table.setModel(new CustomTableModel2());

 

 

컬럼명이 날아가므로 별도의 컬럼명을 String 으로 해줘야한다.

아래 코드를 위 코드 중에서 CustomTableModel2 클래스에 추가하면 된다.

private String[] columnNames = {"컬럼1", "컬럼2", "컬럼3", "컬럼4"};

// 컬럼 이름 넣기
@Override
public String getColumnName(int column) {
    return columnNames[column]; 
}

 

 

 

5. JTree

read only 가 많다.

model 에서 tab 키 치면서  만들고 수정한다. (코드에서 바로 수정하면 안나옴)

tree.setModel(new DefaultTreeModel(
    new DefaultMutableTreeNode("JTree") {
        {
            DefaultMutableTreeNode node_1;
            node_1 = new DefaultMutableTreeNode("과일");
                node_1.add(new DefaultMutableTreeNode("사과"));
                node_1.add(new DefaultMutableTreeNode("딸기"));
                node_1.add(new DefaultMutableTreeNode("수박"));
                node_1.add(new DefaultMutableTreeNode("참외"));
            add(node_1);
            node_1 = new DefaultMutableTreeNode("sports");
                node_1.add(new DefaultMutableTreeNode("basketball"));
                node_1.add(new DefaultMutableTreeNode("soccer"));
                node_1.add(new DefaultMutableTreeNode("football"));
                node_1.add(new DefaultMutableTreeNode("hockey"));
            add(node_1);
        }
    }
));

이렇게 만들어지고 

 

DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTREE");
		
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("과일");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("야채");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("고기");

DefaultMutableTreeNode child11 = new DefaultMutableTreeNode("수박");
DefaultMutableTreeNode child12 = new DefaultMutableTreeNode("참외");

DefaultMutableTreeNode child21 = new DefaultMutableTreeNode("오이");
DefaultMutableTreeNode child22 = new DefaultMutableTreeNode("당근");

DefaultMutableTreeNode child31 = new DefaultMutableTreeNode("소고기");
DefaultMutableTreeNode child32 = new DefaultMutableTreeNode("돼지고기");

node1.add(child11);
node1.add(child12);

node2.add(child21);
node2.add(child22);

node3.add(child31);
node3.add(child32);

root.add(node1);
root.add(node2);
root.add(node3);

tree.setModel(new DefaultTreeModel(root));

 

이렇게도 만들어진다.

 

 

 

※ 응용 문제

주소 검색에 JTable형태로 출력되게 만들기

(1) 내가 한거 (DAO/DTO)

- '검색' 버튼을 누르면 주소테이블이 쫘라락

btn.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        // 초기화 작업

        try {
            if(table != null) {
                String strDong = textField.getText();
                if(strDong.length() < 2) {
                    JOptionPane.showMessageDialog(ZipcodeSearchUI06.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
                }else {

                    table.setModel( new ZipcodeTableModel(strDong));
                }
            }
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
});

- 테이블중 하나를 선택하면 [기본 주소] 에 값 출력

table.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        textField1.setText((String)table.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
    }
});

- 값을 객체로 모델링

package model1;
import java.io.ObjectInputStream.GetField;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class ZipcodeTableModel extends AbstractTableModel {
	
	private ArrayList<ZipcodeTO> values;
	private String[] columnNames = {"우편번호", "시도", "구군", "동", "리", "번지"};
	
	//ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
	 
	public ZipcodeTableModel() {

	}
	
	public ZipcodeTableModel(String strDong) throws ClassNotFoundException, SQLException{
		ZipcodeDAO dao = new ZipcodeDAO();
		values = dao.searchZipcode(strDong);
		
	}
	
	// 컬럼 이름 넣기
	@Override
	public String getColumnName(int column) {
		return columnNames[column]; 
	}

	@Override
	public int getColumnCount() {
		// 컬럼의 갯수 / 안에서 가져오기 어려워서 그냥 정해줌
		return 6;
	}

	@Override
	public int getRowCount() {
		// 데이터의 갯수
		return values.size();
	}
	
	
//	public Object selectRow(int rowIndex) {
//		String result ="";
//		ZipcodeTO to = values.get(rowIndex);
//		result = String.format("[%s] %s %s %s %s %s", to.getZipcode(), to.getSido(),
//				to.getGugun(), to.getDong(), to.getRi(), to.getBunji());
//		return result;
//	}

	

	
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		String result = "";
		ZipcodeTO to = values.get(rowIndex);
		
		switch(columnIndex) {
		case 0 :
			result = to.getZipcode();
			break;
		case 1 :
			result = to.getSido();
			break;
		case 2 :
			result = to.getGugun();
			break;
		case 3 :
			result = to.getDong();
			break;
		case 4 :
			result = to.getRi();
			break;
		case 5 :
			result = to.getBunji();
			break;
		default :
		}
		return result;
	}

}

- DAO

package model1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ZipcodeDAO {
	
	private Connection conn = null;
	
	// 생성자
	// 데이터베이스 접속 
	public ZipcodeDAO() throws ClassNotFoundException, SQLException{
		
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		Class.forName("org.mariadb.jdbc.Driver");
		this.conn = DriverManager.getConnection(url, user, password);
		// Connection conn = DriverManager.getConnection(url, user, password);
	}
	
	// SQL 구문별 메소드  - 동이름과 함께 호출되는 메서드는 그 결과값을 ArrayList<ZipcodeTO>로 리턴
	public ArrayList<ZipcodeTO> searchZipcode(String strDong) throws ClassNotFoundException, SQLException{
		ArrayList<ZipcodeTO> result = new ArrayList<ZipcodeTO>();
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji, seq from zipcode where dong like ?";
	
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, strDong + "%");
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next()) {
			// 생성자 사용
			/*
			String zipcode = rs.getString("zipcode");
			String sido = rs.getString("sido");
			String gugun = rs.getString("gugun");
			String dong = rs.getString("dong");
			String ri = rs.getString("ri");
			String bunji = rs.getString("bunji");
			String seq = rs.getString("seq");
			
			ZipcodeTO to = new ZipcodeTO(zipcode, sido, gugun, dong, ri, bunji, seq);
			*/
			
			// setter 사용
			ZipcodeTO to = new ZipcodeTO();
			to.setZipcode(rs.getString("zipcode"));
			to.setSido(rs.getString("sido"));
			to.setGugun(rs.getString("gugun"));
			to.setDong(rs.getString("dong"));
			to.setRi(rs.getString("ri"));
			to.setBunji(rs.getString("bunji"));
			
			result.add(to);
		}
		
		return result;
	}

}

- DTO

package model1;

public class ZipcodeTO {
	// DAO로 받아온 값들을 조작할 수 있게 선언
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	private String seq;
	
	// 생성자  - setter
	/*
	public ZipcodeTO(String zipcode, String sido, String gugun, String dong, String ri, String bunji, String seq){
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
		this.seq = seq;
	}
	*/
	
	// setter 와 getter
	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getSido() {
		return sido;
	}

	public void setSido(String sido) {
		this.sido = sido;
	}

	public String getGugun() {
		return gugun;
	}

	public void setGugun(String gugun) {
		this.gugun = gugun;
	}

	public String getDong() {
		return dong;
	}

	public void setDong(String dong) {
		this.dong = dong;
	}

	public String getRi() {
		return ri;
	}

	public void setRi(String ri) {
		this.ri = ri;
	}

	public String getBunji() {
		return bunji;
	}

	public void setBunji(String bunji) {
		this.bunji = bunji;
	}

	public String getSeq() {
		return seq;
	}

	public void setSeq(String seq) {
		this.seq = seq;
	}
}
728x90
Comments