지구정복

[JAVA] 12/10 | Swing - JSpinner, JComboBox, JList, JTable, JTree 사용하기 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 12/10 | Swing - JSpinner, JComboBox, JList, JTable, JTree 사용하기

eeaarrtthh 2020. 12. 10. 17:53
728x90
반응형

복습

GUI Project
기획
1. Architectur파트 또는 팀장급 회의
객체모델링
	UML : starUML툴

데이터모델링
	ERD : eXERD

디자인 기획(UI/UX)
	스토리보드(Mockup : Wireframe) : sketch : powermockup 툴 사용

개발(코딩)



데이터 포함할 수 있는 Widget
M(Model) 클래스 : 데이터
V(View) 클래스 : 디자인
	모델에 데이터를 넣으면 디자인을 통해서 얻어온다.

 

ㅇ JSpinner 사용하기

아래와 같이 코드를 작성해서 리스트 값을 설정해준다.

	public JSpinnerEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JSpinner spinner = new JSpinner();
		//1번 방법: spinner.setModel( new SpinnerListModel( new String[] {"사과", "딸기", "수박", "참외"}));
		//2번 방법
        	String[] items = new String[] {"사과", "딸기", "수박", "참외"};
		SpinnerListModel spinnerListModel = new SpinnerListModel( items );
		spinner.setModel( spinnerListModel );
		spinner.setBounds(12, 10, 210, 22);
		contentPane.add(spinner);
	}
}

스크롤을 올리면 리스트 목록이 차례대로 나온다.

 

이번에는 스피너 선언 코드를 다른 클래스에 만들고 가져와보자.

아래와 같이 SpinnerListModel 클래스를 상속받아서 클래스를 만든다.

아래와 같이 코드를 작성한다.

package Pack1;

import javax.swing.SpinnerListModel;

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

	@Override
	public SpinnerListModel getValue() {
		SpinnerListModel spinnerListModel = new SpinnerListModel( items );
		return spinnerListModel;
	}
}

그리고 실행클래스에서 아래와 같이 코드를 작성하고 실행하면 1,2번 방법과 결과가 같다.

//3번 : 클래스를 이용한 방법
spinner.setModel( new UserSpinnerListModel().getValue() );

 

이번에는 스피너의 값을 가져와보자.

일단 디자인에서 버튼을 하나 만든다.

또한 스피너를 전역변수로 만든다.

이때 스피너의 value값은 object타입이기에 string으로 강제형변환시켜야 한다.

		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String value = (String)spinner.getValue();
				System.out.println( value );
			}
		});

이제 버튼을 누르면 해당 스피너 목록값이 출력된다.

 

이번에는 스피너 자체에 이벤트를 넣어보자.

값이 변할 때마다 이벤트가 실행되는 것이다.

아래와 같이 코드를 작성한다.

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

보통 스피너는 버튼을 이용한 이벤트보다는 스피너 자체에 이벤트를 주는 경우가 많다.

 

다음으로 숫자에 관한 스피너를 사용해보자.

스피너를 한 개 더 추가한다.

그리고 속성을 아래와 같이 설정한다.

Initial value는 초기값, Minimum은 최소값, Maximum은 최대값, Step size는 증가되는 값을 의미한다.

 

 

ㅇJComboBox 사용하기

일반적으로 스피너는 숫자를 많이 사용하고 콤보박스에는 문자를 많이 사용한다.

속성값에서 selectedIndex는 초기에 선택되는 콤보박스를 의미한다. -1은 선택되지 않음이고

0으로 두면 첫 번째 사과가 초기값으로 들어간다.

 

이제 버튼을 만들어서 해당 콤보박스 값과 인덱스를 출력해보자. 이때 콤보박스의 값은 object타입이다.

		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println( comboBox.getSelectedIndex() );
				System.out.println( (String)comboBox.getSelectedItem() );
			}
		});

 

이번에도 클래스를 이용해서 만들어보자.

아래와 같이 상속받아서 클래스를 만든다.

아래와 같이 코드를 작성한다.

package Pack1;

import javax.swing.DefaultComboBoxModel;

public class ComboBoxModel extends DefaultComboBoxModel<Object> {
	private String[] datas1 = new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"};
	
	@Override
	public int getSize() {
		System.out.println( "getSize() 호출" );
		return datas1.length;
	}
	
	@Override
	public Object getElementAt(int index) {
		System.out.println( "getElementAt() 호출" );
		return datas1[index];
	}
}

실행클래스에서는 아래와 같이 작성한다.

	public JComboBoxEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JComboBox comboBox = new JComboBox();
		//1번 방법 : comboBox.setModel(new DefaultComboBoxModel(new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"}));
		//2번 방법 : 클래스를 이용한 메서드 호출
		comboBox.setModel( new ComboBoxModel() );
		
		comboBox.setSelectedIndex(0);
		comboBox.setBounds(12, 10, 187, 23);
		contentPane.add(comboBox);

같은 결과가 나온다.

 

이를 callback함수라 한다.

ComboBoxModel 클래스에서 datas1이라는 데이터를 넣어주면 시스템이 저절로 getSize()와 getElementAt()메서드를 이용해서 datas1의 데이터를 읽은 다음에 콤보박스 안에 넣어준다.

 

 

이번에는 ComboBoxModel 클래스에서 String[]에 데이터를 저장하지 않고 ArrayList에 데이터를 저장하고

콤보박스에 데이터를 채워보자.

아래와 같이 코드를 작성해야 한다.

package Pack1;

import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;

public class ComboBoxModel extends DefaultComboBoxModel<Object> {
	//private String[] datas1 = new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"};
	private ArrayList<String> datas2 = new ArrayList<String>();
	
	//생성자가 만들어지는 순간 datas2에 아래의 데이터들이 들어간다.
	public ComboBoxModel() {
		datas2.add( "사과 1" );
		datas2.add( "딸기 1" );
		datas2.add( "수박 1" );
		datas2.add( "참외 1" );
	}

	@Override
	public int getSize() {
		System.out.println( "getSize() 호출" );
		return datas2.size();
	}
	
	@Override
	public Object getElementAt(int index) {
		System.out.println( "getElementAt() 호출" );
		return datas2.get( index );
	}
}

 

이번에도 콤보박스 자체에 이벤트를 설정해보자.

이벤트 핸들러 -> item -> itemStateChange 이벤트를 만들고 아래와 같이 코딩한다.

		JComboBox comboBox = new JComboBox();
		comboBox.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				//선택됐을 때만 출력하기
				if( e.getStateChange() == ItemEvent.SELECTED ) {
					System.out.println( (String)comboBox.getSelectedItem() + " 선택됨" );
				}
			}
		});

 

ㅇJList 사용하기

먼저JList를 만들면 아주 작게 나오는데 설정값에서 width와 height값을 늘려준다.

그리고 model에 아래와 같은 리스트를 추가하고, selectedIndex는 1, selection은 단일 선택으로 한다.

그리고 모델 리스트에 값을 많이 주면 리스트를 벗어나므로 아래와 같이 스크롤패인을 만든다.

이때 스크롤 패인의 설정값은 필요할경우 스크롤 생성, 스크롤 생성안함, 스크롤 항상 생성의 설정을 지정할 수 있다.

 

이번에는 클래스를 이용해서 JList의 값을 먄들어보자.

그리고 클래스명 오류난 곳에 아래처럼 마우스를 대면 매서드를 추가하라고 나온다.

또한 제네릭에 String형태로 바꿔준다. 그러면 자동으로 getSize와 getElementAt메서드가 생성된다.

아래와 같이 코딩한다.

package Pack1;

import javax.swing.AbstractListModel;

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

	@Override
	public String getElementAt(int index) {
		return values[index];
	}
}

실행클래스에서 아래와 같이 코딩하고 실행한다.

	public JListEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 10, 144, 241);
		contentPane.add(scrollPane);
		
		JList list = new JList();
		scrollPane.setViewportView(list);
		//1.
		/*
		list.setModel(new AbstractListModel() {
			String[] values = new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"};
			public int getSize() {
				return values.length;
			}
			public Object getElementAt(int index) {
				return values[index];
			}
		});
		*/
		
		list.setModel( new CustomListModel() );
		
		list.setSelectedIndex(1);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	}

 

이제 이벤트를 설정해보자.

디자인에서 버튼을 하나 추가한다. 그리고 리스트를 전역변수로 만든다.

		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println( list.getSelectedIndex() );
				System.out.println( (String)list.getSelectedValue() );
			}
		});

 

이번에는 JList에 이벤트를 설정한다. 이벤트 핸들러 -> 마우스 -> 마우스클릭

		list = new JList();
		list.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println( list.getSelectedIndex() );
				System.out.println( (String)list.getSelectedValue() );
			}
		});

 

 

이번에는 리스트를 이용해서 우편번호 검색기를 만들어본다.

디자인은 아래와 같다.

1) 내코드

-CustomListModel2 클래스

package Pack1;

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 CustomListModel2 extends AbstractListModel<String> {
	private ArrayList<String> values = new ArrayList<String>();
	private Connection conn = null;
	
	public CustomListModel2(String strDong) throws ClassNotFoundException, SQLException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		//sql실행 및 sql결과 받아오기
		
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji 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 address = String.format("[%s] %s %s %s %s %s\n",
					zipcode, sido, gugun, dong, ri, bunji);
			values.add( address );
		}
		if( rs != null ) rs.close();
		if( pstmt != null ) pstmt.close();
		if( conn != null ) conn.close();
		
	}
	
	@Override
	public int getSize() {
		return values.size();
	}

	@Override
	public String getElementAt(int index) {
		return values.get(index);
	}
}

실행클래스

package Pack1;

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 javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;

public class ZipcodeSearchUI1 extends JFrame {

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

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 670, 550);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uD558\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 630, 68);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9\uC774\uB984");
		lblNewLabel.setBounds(12, 31, 57, 15);
		panel.add(lblNewLabel);
		
		textField1 = new JTextField();
		textField1.setBounds(61, 28, 432, 21);
		panel.add(textField1);
		textField1.setColumns(10);
		
		JButton btn = new JButton("\uAC80\uC0C9");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String strDong = textField1.getText();
				if ( list != null ) {
					try {
						list.setModel( new CustomListModel2( strDong ) );
					} catch (ClassNotFoundException | SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});
		btn.setBounds(500, 27, 118, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setBounds(12, 85, 630, 310);
		contentPane.add(scrollPane);
		
		list = new JList();
		scrollPane.setViewportView(list);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		textField2 = new JTextField();
		textField2.setEditable(false);
		textField2.setText("\uAE30\uBCF8\uC8FC\uC18C");
		textField2.setBounds(12, 431, 630, 21);
		contentPane.add(textField2);
		textField2.setColumns(10);
		
		textField3 = new JTextField();
		textField3.setText("\uC0C1\uC138\uC8FC\uC18C");
		textField3.setColumns(10);
		textField3.setBounds(12, 480, 630, 21);
		contentPane.add(textField3);
	}
}

-결과

 

2) 강사님 코드

DAO/TO 사용

-ZipcodeTO

package Pack1;

public class ZipcodeTO {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	
	public ZipcodeTO(String zipcode, String sido, String gugun, String dong, String ri, String bunji) {
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
	}

	public String getZipcode() {
		return zipcode;
	}

	public String getSido() {
		return sido;
	}

	public String getGugun() {
		return gugun;
	}

	public String getDong() {
		return dong;
	}

	public String getRi() {
		return ri;
	}

	public String getBunji() {
		return bunji;
	}
}

-ZipcodeDAO

package Pack1;

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 ArrayList<ZipcodeTO> values = new ArrayList<ZipcodeTO>();
	private Connection conn;

	public ArrayList<ZipcodeTO> searchZipcode(String strDong) throws SQLException, ClassNotFoundException {
			//db 연결 정보
			String url = "jdbc:mysql://localhost:3307/sample";
			String user = "root";
			String password = "!123456";
			
			//db 드라이버 로딩
			Class.forName( "org.mariadb.jdbc.Driver" );
			this.conn = DriverManager.getConnection(url, user, password);
			
			//sql실행 및 sql결과 받아오기
			String sql = "select zipcode, sido, gugun, dong, ri, bunji 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" );
				ZipcodeTO address = new ZipcodeTO( zipcode, sido, gugun, dong, ri, bunji );
				values.add( address) ;
			}
			if( rs != null ) rs.close();
			if( pstmt != null ) pstmt.close();
			if( conn != null ) conn.close();
			
			return values;
	}
}

-ZipcodeListModel

package Pack1;

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 ZipcodeListModel extends AbstractListModel<String> {
	private ArrayList<ZipcodeTO> values;
	Connection conn = null;
	
	public ZipcodeListModel(String strDong) throws ClassNotFoundException, SQLException {
		ZipcodeDAO dao = new ZipcodeDAO();
		values = dao.searchZipcode( strDong );
	}

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

	@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;
	}
}

-실행클래스

package Pack1;

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 javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;

public class ZipcodeSearchUI1 extends JFrame {

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

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 670, 550);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uD558\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 630, 68);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9\uC774\uB984");
		lblNewLabel.setBounds(12, 31, 57, 15);
		panel.add(lblNewLabel);
		
		textField1 = new JTextField();
		textField1.setBounds(61, 28, 432, 21);
		panel.add(textField1);
		textField1.setColumns(10);
		
		JButton btn = new JButton("\uAC80\uC0C9");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if ( list != null ) {
					String strDong = textField1.getText();
					try {
						if( strDong.length() < 2 ) {
							JOptionPane.showMessageDialog(ZipcodeSearchUI1.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
						} else {
							list.setModel( new ZipcodeListModel( strDong ) );
						}
					} catch (ClassNotFoundException | SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});
		btn.setBounds(500, 27, 118, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setBounds(12, 85, 630, 310);
		contentPane.add(scrollPane);
		
		list = new JList();
		scrollPane.setViewportView(list);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		textField2 = new JTextField();
		textField2.setEditable(false);
		textField2.setText("\uAE30\uBCF8\uC8FC\uC18C");
		textField2.setBounds(12, 431, 630, 21);
		contentPane.add(textField2);
		textField2.setColumns(10);
		
		textField3 = new JTextField();
		textField3.setText("\uC0C1\uC138\uC8FC\uC18C");
		textField3.setColumns(10);
		textField3.setBounds(12, 480, 630, 21);
		contentPane.add(textField3);
	}
}

 

 

ㅇJTable 사용하기

 

컬럼과 행을 늘리려면 오른쪽 Columns의 Count와 Rows의 Count를 올려주면 된다.

컬럼명을 바꾸려면 해당 컬럼줄의 아무 셀을 클릭한다음 밑에 Title을 바꿔주면 되고

각 셀에 글을 못쓰게하려면 editable을 해제하면된다.

 

실행하면 아래와 같다.

 

 

이번에는 클래스을 통해서 JTblae을 만들어보자.

아래는 JTable을 만들기 위해 데이터를 정의하는 방법 3가지가 나와있다.

-CustomTableModel

package Pack1;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class CustomTableModel extends AbstractTableModel {
	//데이터가 2차원 배열 / ArrayList<ArrayList> / ArrayList<TO> 
	//위의 3가지 방식으로 데이터를 정의해야 한다.
	//1번째 방법
	private String[][] datas1 = new String[][] { 
		{"11", "12", "13", "14"},
		{"21", "22", "23", "24"},
		{"31", "32", "33", "34"},
		};
	
	//2번째 방법
	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 getRowCount() {
		//return datas1.length;
		return datas2.size();
	}

	@Override //열의 개수
	public int getColumnCount() {
		//return datas1[0].length;
		return datas2.get(0).size();
	}

	@Override //
	public Object getValueAt(int rowIndex, int columnIndex) {
		//return datas1[rowIndex][columnIndex];
		return datas2.get(rowIndex).get(columnIndex);
	}
}

-실행클래스

package Pack1;

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;

public class JTableEx1 extends JFrame {

	private JPanel contentPane;
	private JTable table;

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

	/**
	 * Create the frame.
	 */
	public JTableEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 534, 447);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 10, 383, 300);
		contentPane.add(scrollPane);
		
		table = new JTable();
		/*
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
			},
			new String[] {
				"\uCEEC\uB7FC1", "\uCEEC\uB7FC2", "\uCEEC\uB7FC3", "\uCEEC\uB7FC4", "\uCEEC\uB7FC5"
			}
		) {
			boolean[] columnEditables = new boolean[] {
				true, true, true, true, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		*/
		
		table.setModel( new CustomTableModel() );     <---여기
		scrollPane.setViewportView(table);
	}
}

 

3번째 방법인 To를 이용해서 테이블을 만들어보자.

-TableTO class

package Pack1;

public class TableTO {
	private String col1;
	private String col2;
	private String col3;
	private String col4;
	
	//생성자 겸 Setter
	public TableTO(String col1, String col2, String col3, String col4) {
		this.col1 = col1;
		this.col2 = col2;
		this.col3 = col3;
		this.col4 = col4;
	}
	
	//Getter
	public String getCol1() {
		return col1;
	}

	public String getCol2() {
		return col2;
	}

	public String getCol3() {
		return col3;
	}

	public String getCol4() {
		return col4;
	}
}

-CustomTableModel2 class

package Pack1;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class CustomTableModel2 extends AbstractTableModel {
	private ArrayList<TableTO> datas;

	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 getRowCount() {
		return datas.size();
	}

	@Override //열의 개수
	public int getColumnCount() {
		//컬럼의 개수를 직접 가져오기 어려우므로 그냥 명시해준다.
		return 4;
	}

	@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;
		}
		return result;
	}
}

실행클래스에서는 클래스명만 아래처럼 바꿔준다.

table.setModel( new CustomTableModel2() );

같은 결과가 나오는 것을 확인할 수 있다.

 

이번에는 모델클래스 쪽에서 컬러명을 설정해보자.

package Pack1;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class CustomTableModel2 extends AbstractTableModel {
	private ArrayList<TableTO> datas;
	private String[] columnNames = { "컬럼1", "컬럼2", "컬럼3", "컬럼4" };

	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 String getColumnName(int column) {
		return columnNames[column];
	}

	@Override //행의 개수
	public int getRowCount() {
		return datas.size();
	}

	@Override //열의 개수
	public int getColumnCount() {
		//컬럼의 개수를 직접 가져오기 어려우므로 그냥 명시해준다.
		return 4;
	}

	@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;
		}
		return result;
	}
}

 

이번에는 테이블 자체에 이벤트를 설정하자.

이벤트 코드

table = new JTable();
table.addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e) {
		System.out.println( table.getSelectedColumn() );
		System.out.println( table.getSelectedRow() );
		
		System.out.println( table.getValueAt( table.getSelectedRow(), table.getSelectedColumn() ));
	}
});

 

이번에는 우편번호를 JTable을 이용해서 만들어보자.

클래스는 네 가지가 있어야 한다.

 

UI 클래스 : 디자인 담당

Model 클래스 : DAO클래스로부터 우편번호 데이터 받아서 UI클래스에 JTable 만드는 담당

DAO 클래스 : 데이터베이스 연결한 다음 TO테이블 이용해서 우편번호 데이터 받아오는 담당

TO 클래스 : DAO 클래스가 우편번호 데이터 받을 수 있도록 도와주는 담당

 

실행순서는 다음과 같다.

1. UI 클래스에서 사용자 입력값(strDong)을 매개변수로해서

table.setModel( 모델클래스 생성자(strDong) ); 로 테이블을 만든다.

2. 모델클래스의 생성자는 DAO클래스의 searchZipcode(strDong) 메서드의 리런값을 이용해서

   테이블의 열, 행, 데이터값을 만든다.

3. DAO클래스는 searchZipcode(strDong) 란 메서드를 통해 데이터베이스에 연결하고 strDong에 맞는

   우편번호를 가져온 뒤 ArrayList<TO클래스> 타입으로 리턴해준다.

4. TO클래스는 데이터베이스 내에 있는 테이블의 컬럼명과 각 컬럼명에 해당하는 데이터를 보내주는 Getter 메서드를

   선언해준다.

 

 

-UI 클래스

package Pack1210;

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.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;

public class ZipcodeUI1 extends JFrame {

	private JPanel contentPane;
	private JTextField textField1;
	private JTable table;

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

	/**
	 * Create the frame.
	 */
	public ZipcodeUI1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 653, 519);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 10, 619, 62);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9\uC774\uB984");
		lblNewLabel.setBounds(12, 33, 57, 15);
		panel.add(lblNewLabel);
		
		textField1 = new JTextField();
		textField1.setBounds(66, 30, 439, 21);
		panel.add(textField1);
		textField1.setColumns(10);
		
/////여기서부터 코딩내용------------------------------------------------------
		table = new JTable();
		
		JButton btn1 = new JButton("\uAC80\uC0C9");
		btn1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String strDong = textField1.getText();
				if ( table != null ) {
					if ( strDong.length() < 2 ) {
						JOptionPane.showMessageDialog(ZipcodeUI1.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
					} else {
						try {
							table.setModel( new ZipcodeJTableModel1( strDong ) );
						} catch (ClassNotFoundException | SQLException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
			}
		});
/////여기까지 코딩내용 ----------------------------------------------------
		btn1.setBounds(516, 29, 97, 23);
		panel.add(btn1);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 85, 613, 385);
		contentPane.add(scrollPane);
		
		scrollPane.setViewportView(table);
	}
}

-Model 클래스

package Pack1210;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class ZipcodeJTableModel1 extends AbstractTableModel {
	private String[] columnNames = {"집코드", "시도", "구군", "동", "리", "번지"};
	private ArrayList<ZipcodeJTableTO1> datas;
	
	
	
	public ZipcodeJTableModel1( String strDong ) throws ClassNotFoundException, SQLException {
		ZipcodeJTableDAO1 dao = new ZipcodeJTableDAO1();
		datas = dao.searchZipcode( strDong );
	}

	@Override //테이블 컬럼명 메서드
	public String getColumnName(int column) {
		return columnNames[column];
	}
	
	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return datas.size();
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 6;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		String result = "";
		ZipcodeJTableTO1 to = datas.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;
		}
		return result;
	}
}

-DAO 클래스

package Pack1210;

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 ZipcodeJTableDAO1 {
	private ArrayList<ZipcodeJTableTO1> values = new ArrayList<ZipcodeJTableTO1>();
	private Connection conn;

	public ArrayList<ZipcodeJTableTO1> searchZipcode(String strDong) throws SQLException, ClassNotFoundException {
			//db 연결 정보
			String url = "jdbc:mysql://localhost:3307/sample";
			String user = "root";
			String password = "!123456";
			
			//db 드라이버 로딩
			Class.forName( "org.mariadb.jdbc.Driver" );
			this.conn = DriverManager.getConnection(url, user, password);
			
			//sql실행 및 sql결과 받아오기
			String sql = "select zipcode, sido, gugun, dong, ri, bunji 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" );
				ZipcodeJTableTO1 address = new ZipcodeJTableTO1( zipcode, sido, gugun, dong, ri, bunji );
				values.add( address) ;
			}
			if( rs != null ) rs.close();
			if( pstmt != null ) pstmt.close();
			if( conn != null ) conn.close();
			
			return values;
	}
}

-TO 클래스

package Pack1210;

public class ZipcodeJTableTO1 {
	//Field
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	
	//Constructor and Setter
	public ZipcodeJTableTO1 (String zipcode, String sido, String gugun, String dong, String ri, String bunji) {
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
	}
	
	//Getter
	public String getZipcode() {
		return zipcode;
	}

	public String getSido() {
		return sido;
	}

	public String getGugun() {
		return gugun;
	}

	public String getDong() {
		return dong;
	}

	public String getRi() {
		return ri;
	}

	public String getBunji() {
		return bunji;
	}
}

-실행결과

 

ㅇJTree 사용하기

위에 처럼 모델 속성에 들어가면 텍스트를 쓸 수 있고 Tab키를 눌러서 디렉터리를 구분한다.

 

이번에는 직접 소스코드를 수정해서 JTree를 만들어보자.

아래와 같이 코딩한다.

package Pack1;

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultMutableTreeNode;

public class JTreeEx1 extends JFrame {

	private JPanel contentPane;

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

	/**
	 * Create the frame.
	 */
	public JTreeEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JTree tree = new JTree();
		/*
		tree.setModel(new DefaultTreeModel(
			new DefaultMutableTreeNode("JTree") {
				{
					DefaultMutableTreeNode node_1;
					node_1 = new DefaultMutableTreeNode("\uACFC\uC77C");
						node_1.add(new DefaultMutableTreeNode("\uC0AC\uACFC"));
						node_1.add(new DefaultMutableTreeNode("\uB538\uAE30"));
						node_1.add(new DefaultMutableTreeNode("\uC218\uBC15"));
					add(node_1);
				}
			}
		));
		*/
		////직접 JTree 만들기
		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);
		node1.add(child21); node1.add(child22);
		node1.add(child31); node1.add(child32);
		
		root.add(node1); root.add(node2); root.add(node3);
		
		tree.setModel( new DefaultTreeModel(root) );
		
		tree.setBounds(12, 10, 135, 241);
		contentPane.add(tree);
	}
}

 

 

728x90
반응형
Comments