[JAVA_Back-End]

[JAVA] GUI(3) 본문

Programming/JAVA

[JAVA] GUI(3)

너굴위 2023. 9. 14. 16:31
728x90
반응형

< 지난 포스팅 정리 >

Swing - Java GUI

          - 방법론

 

1.DAO / (D)TO

데이터 접근..

 

* tier - layer

GUI

JFrame

JPanel(Border)

JLabel

JtextField / JPasswordField / JTextArea

=> 입력 / 출력(JLabel)

JButton

 

체크박스 라디오..


JCheckBoxEx01.java  - CheckBox만들기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JCheckBoxEx01 extends JFrame {

private JPanel contentPane;
private JCheckBox CB1;
private JCheckBox CB2;
private JCheckBox CB3;
private JCheckBox CB4;
private JButton btn2;
private JButton btn3;
private JButton btn4;

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

/**
 * Create the frame.
 */
public JCheckBoxEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

CB1 = new JCheckBox("사과");
CB1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(CB1.isSelected()) {
System.out.println("선택");
}else {
System.out.println("해제");
}
}
});
CB1.setSelected(true);
CB1.setBounds(23, 25, 115, 23);
contentPane.add(CB1);

CB2 = new JCheckBox("수박");
CB2.setBounds(23, 50, 115, 23);
contentPane.add(CB2);

CB3 = new JCheckBox("참외");
CB3.setBounds(23, 75, 115, 23);
contentPane.add(CB3);

CB4 = new JCheckBox("딸기");
CB4.setBounds(23, 100, 115, 23);
contentPane.add(CB4);

JButton btn1 = new JButton("선택");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

if(CB1.isSelected()) {
System.out.println("bx1 선택: "+ CB1.getText());   //getText()로 체크된 내용을 가져옴
}
if(CB2.isSelected()) {
System.out.println("bx2 선택: "+ CB2.getText());
}
if(CB3.isSelected()) {
System.out.println("bx3 선택: "+ CB3.getText());
}
if(CB4.isSelected()) {
System.out.println("bx4 선택: "+ CB4.getText());
}

}
});
btn1.setBounds(23, 129, 97, 23);
contentPane.add(btn1);

btn2 = new JButton("전체선택");
btn2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

CB1.setSelected(true);
CB2.setSelected(true);
CB3.setSelected(true);
CB4.setSelected(true);
}
});
btn2.setBounds(23, 165, 97, 23);
contentPane.add(btn2);

btn3 = new JButton("전체해제");
btn3.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
CB1.setSelected(false);
CB2.setSelected(false);
CB3.setSelected(false);
CB4.setSelected(false);
}
});
btn3.setBounds(23, 198, 97, 23);
contentPane.add(btn3);

btn4 = new JButton("전체선택");
btn4.addMouseListener(new MouseAdapter() {
//boolean check =true;    //기본 true로 설정 후 클릭할 수 있도록 함(if문 실행)  if문에 check넣으면 이름은 바뀌지 않고 동작은 함
@Override
public void mouseClicked(MouseEvent e) {
if(btn4.getText().equals("전체선택")) {   //if문이 실행되면 다음은 전체 취소가 될테니까 check를 false로 설정(다음클릭 시 else문 실행될 것임)
CB1.setSelected(true);
CB2.setSelected(true);
CB3.setSelected(true);
CB4.setSelected(true);
//check=false;
btn4.setText("전체해제");
}else {
CB1.setSelected(false);
CB2.setSelected(false);
CB3.setSelected(false);
CB4.setSelected(false);
//check=true;
btn4.setText("전체선택");
}
}
});
btn4.setBounds(23, 235, 97, 23);
contentPane.add(btn4);
}
}

 

결과

 

 

JRadiobuttonEx01.java   - RadioButton만들기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JRadioButtonEx01 extends JFrame {

private JPanel contentPane;
private final ButtonGroup buttonGroup = new ButtonGroup();
private JRadioButton btn1;
private JRadioButton btn2;
private JRadioButton btn3;
private JRadioButton btn4;

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

/**
 * Create the frame.
 */
public JRadioButtonEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

btn1 = new JRadioButton("사과");
btn1.setSelected(true);
buttonGroup.add(btn1);   //buttongroup에 포함시킴
btn1.setBounds(8, 6, 121, 23);
contentPane.add(btn1);

btn2 = new JRadioButton("수박");
buttonGroup.add(btn2);
btn2.setBounds(8, 31, 121, 23);
contentPane.add(btn2);

btn3 = new JRadioButton("참외");
buttonGroup.add(btn3);
btn3.setBounds(8, 56, 121, 23);
contentPane.add(btn3);

btn4 = new JRadioButton("딸기");
buttonGroup.add(btn4);
btn4.setBounds(8, 81, 121, 23);
contentPane.add(btn4);

JButton btn5 = new JButton("선택");
btn5.addMouseListener(new MouseAdapter() {     //checkbox => 다중, radiobutton => 단일
@Override
public void mouseClicked(MouseEvent e) {

if(btn1.isSelected()) {     //선택된 내용을 버튼을 클릭해 확인하기
System.out.println("rdbtn1 선택");
}else if(btn2.isSelected()) {
System.out.println("rdbtn2 선택");
}else if(btn3.isSelected()) {
System.out.println("rdbtn3 선택");
}else if(btn4.isSelected()) {
System.out.println("rdbtn4 선택");
}
}
});
btn5.setBounds(12, 110, 128, 23);
contentPane.add(btn5);
}
}

결과

 

 

JOptionPaneEx01.java  - 팝업(경고)창 띄우기
import java.awt.EventQueue;


import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class JOptionPaneEx01 extends JFrame {


private JPanel contentPane;


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


/**
* Create the frame.
*/
public JOptionPaneEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));


setContentPane(contentPane);
contentPane.setLayout(null);

JButton btn1 = new JButton("New button");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//JOptionPane.showMessageDialog(JOptionPaneEx01.this, "메세지");
JOptionPane.showMessageDialog(JOptionPaneEx01.this, "메세지","타이틀", JOptionPane.QUESTION_MESSAGE );
}
});
btn1.setBounds(12, 10, 97, 23);
contentPane.add(btn1);

JButton btn2 = new JButton("New button");
btn2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) { //확인창 띄우기
//JOptionPane.showConfirmDialog(JOptionPaneEx01.this, "메세지"); //인스턴스 없으면 static
int result=JOptionPane.showConfirmDialog(JOptionPaneEx01.this, "메세지","타이틀",JOptionPane.OK_CANCEL_OPTION);
if(result==JOptionPane.OK_OPTION) {
System.out.println("OK_OPTION");
}else if(result==JOptionPane.CANCEL_OPTION) {
System.out.println("CANCEL_OPTION");
}else if(result==JOptionPane.CLOSED_OPTION) {
System.out.println("CLOSED_OPTION");
}else {
System.out.println("기타");
}
}
});
btn2.setBounds(12, 47, 97, 23);
contentPane.add(btn2);

JButton btn3 = new JButton("New button");
btn3.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//JOptionPane.showInputDialog("메세지");
String msg = JOptionPane.showInputDialog("메시지","내용");
//System.out.println("메시지: "+msg);

if(msg!=null) {
System.out.println(msg);
}else {
System.out.println("취소클릭");
}
}
});
btn3.setBounds(12, 90, 97, 23);
contentPane.add(btn3);
}


}

 

메세지 띄우기 결과
취소클릭 했을 때

 

 

JOptionPaneEx02.java  - 팝업입력창으로 단수 입력하여 구구단 출력하기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JOptionPaneEx02 extends JFrame {

private JPanel contentPane;
private JTextArea textArea;

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

/**
 * Create the frame.
 */
public JOptionPaneEx02() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

JButton btn = new JButton("구구단 입력");
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {

String msg = JOptionPane.showInputDialog("구구단을 입력하세요");

if(msg!=null) {
textArea.setText(gugudan(msg));
}else {
textArea.setText("다시 입력바랍니다");
}
}
});
btn.setBounds(25, 20, 529, 23);
contentPane.add(btn);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(25, 57, 529, 461);
contentPane.add(scrollPane);

textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea);
}

public String gugudan(String num) {
String result="";
for(int i=1; i<=9;i++) {
result+= num+"x"+i+"="+ Integer.parseInt(num)*i+"\n";
}
return result;
}
}

 

단수입력 팝업 결과

 

단수 출력 결과

 

 

JProgressBarEx01.java - 진행상태 바 구현하기 (최소/ 최대값에 도달했을 때 팝업창 띄우기)
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JProgressBar;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JProgressBarEx01 extends JFrame {

private JPanel contentPane;
private JProgressBar progressBar;
private JButton btnNewButton;
private JButton btnNewButton_1;

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

/**
 * Create the frame.
 */
public JProgressBarEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

progressBar = new JProgressBar();
progressBar.setStringPainted(true);
progressBar.setValue(50);
progressBar.setBounds(12, 10, 560, 14);
contentPane.add(progressBar);

JButton btn1 = new JButton("New button");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(progressBar.getValue());
progressBar.setValue(150);
}
});
btn1.setBounds(12, 34, 97, 23);
contentPane.add(btn1);

//최소값/최대값에 도달했을 때 경고창

btnNewButton = new JButton("감소(-10)");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
progressBar.setValue(progressBar.getValue()-10);
if(progressBar.getValue()==progressBar.getMinimum()) {
JOptionPane.showMessageDialog(JProgressBarEx01.this, "더 이상 감소가 불가합니다","Warning", JOptionPane.WARNING_MESSAGE );
}
}
});
btnNewButton.setBounds(12, 67, 97, 23);
contentPane.add(btnNewButton);

btnNewButton_1 = new JButton("증가(+10)");
btnNewButton_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
progressBar.setValue(progressBar.getValue()+10);
if(progressBar.getValue()==progressBar.getMaximum()) {
JOptionPane.showMessageDialog(JProgressBarEx01.this, "더 이상 증가가 불가합니다","Warning", JOptionPane.WARNING_MESSAGE  );
}
}
});
btnNewButton_1.setBounds(121, 67, 97, 23);
contentPane.add(btnNewButton_1);
}
}

 

최소값에 도달했을 때 결과
최대값 도달했을 때 결과

 

 

Jslider

majorTick - 큰 범위       

minorTick -작은범위

paintLabels와 paintTicks를 다 true로 설정

 

 

 

 

 

JSliderEx01.java - 슬라이더 구현하기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSlider;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

public class JSliderEx01 extends JFrame {

private JPanel contentPane;
private JScrollPane scrollPane;
private JTextArea textArea;
private JSlider slider;

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

/**
 * Create the frame.
 */
public JSliderEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

slider = new JSlider();
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
//System.out.println(slider.getValue());
textArea.append(slider.getValue()+System.lineSeparator());  //슬라이더 바의 움직임 값을 textArea에 연결(append)해서 표시
}
});
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(10);
slider.setBounds(12, 10, 560, 76);
contentPane.add(slider);

JButton btn1 = new JButton("New button");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(slider.getValue());

}
});
btn1.setBounds(12, 108, 97, 23);
contentPane.add(btn1);

scrollPane = new JScrollPane();
scrollPane.setBounds(12, 141, 560, 263);
contentPane.add(scrollPane);

textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
}

 

값의 변화에 따라 그대로 출력되는 textarea와 버튼을 누르면 시스템 출력될 수 있도록 만들었다

 

JSpinner

JSpinnerEx01.java  - 여러가지 Spinner 구현하기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerDateModel;
import java.util.Date;
import java.util.Calendar;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class JSpinnerEx01 extends JFrame {

private JPanel contentPane;
private JSpinner spinner02;
private JSpinner spinner03;
private JSpinner spinner01;
private JButton btn2;

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

/**
 * Create the frame.
 */
public JSpinnerEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);


spinner01 = new JSpinner();
spinner01.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println((Integer)spinner01.getValue());
}
});
SpinnerNumberModel spinnerNumberModel1=new SpinnerNumberModel(50,0,100,10);
//spinner01.setModel(new SpinnerNumberModel(50, 0, 100, 10));    //초기값 설정 가능
spinner01.setBounds(151, 10, 168, 28);
contentPane.add(spinner01);

spinner02 = new JSpinner();
spinner02.setModel(new SpinnerListModel(new String[] {"\uC0AC\uACFC", "\uCC38\uC678 ", "\uC218\uBC15", "\uB538\uAE30", "\uBCF5\uC22D\uC544"}));
spinner02.setBounds(151, 62, 168, 28);
contentPane.add(spinner02);

spinner03 = new JSpinner();
spinner03.setModel(new SpinnerDateModel(new Date(1691938800000L), new Date(1691938800000L), new Date(1820847600000L), Calendar.DAY_OF_YEAR));
spinner03.setBounds(151, 115, 168, 28);
contentPane.add(spinner03);

JButton btn1 = new JButton("New button");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//데이터 가져오기
System.out.println((Integer)spinner01.getValue());     //spinner안의 내용이 어떤 형인지 확인 후 형변환 하여 출력해야한다.
System.out.println((String)spinner02.getValue());
}
});
btn1.setBounds(151, 165, 97, 23);
contentPane.add(btn1);

btn2 = new JButton("New button");
btn2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
spinner02.setModel(new SpinnerListModel(new String[] {"\uC0AC\uACFC", "\uCC38\uC678 ", "\uC218\uBC15", "\uB538\uAE30", "\uBCF5\uC22D\uC544"}));  //버튼에 spinner내용을 동적으로 부여
}
});
btn2.setBounds(151, 198, 97, 23);
contentPane.add(btn2);
}
}

맨 위 스피너를 조작하면 해당 값이 그대로 시스템 출력된다. 나머지 두개는 차례대로 문자열과 날짜에 관한 스피너이다.

 

 

 

Database + Spinner

JSpinnerEx02.java - 직업 목록 데이터베이스에서 불러온 후, 스피너에 목록 적용하기
                                  (emp테이블에서 직책이름을 선택하면 직책이름이 뭐가 있는지 리스트에 넣기)
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.JScrollBar;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.SpinnerListModel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class JSpinnerEx02 extends JFrame {

private JPanel contentPane;
private JTextArea textArea;
private JSpinner spinner;

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

/**
 * Create the frame.
 */
public JSpinnerEx02() {



setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

JLabel lbl01 = new JLabel("직책");
lbl01.setBounds(32, 23, 57, 15);
contentPane.add(lbl01);

spinner = new JSpinner();
spinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
String strjob=(String)spinner.getValue();
if(strjob=="직책이름") {
getData();
}
}
});
//spinner.setModel(new SpinnerListModel(new String[] {"\uC9C1\uCC45\uC774\uB984"}));
spinner.setModel(new SpinnerListModel(getData()));     //받아온 데이터를 spinner에 넣기위한 동적 할당
spinner.setBounds(88, 20, 462, 22);
contentPane.add(spinner);     

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(26, 68, 532, 559);
contentPane.add(scrollPane);

textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea);
}

public String[] getData() {
String url = "jdbc:mariadb://localhost:3306/sample";
String user = "root";
String password = "!123456";

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String[] datas =null;
try {
Class.forName( "org.mariadb.jdbc.Driver" );

conn = DriverManager.getConnection(url, user, password);

String sql = "select distinct job from emp";
pstmt = conn.prepareStatement( sql );

rs = pstmt.executeQuery();

rs.last();   //데이터 개수 확인 ( 중요)
int count = rs.getRow();
rs.beforeFirst();

datas = new String[count];
int idx=0;

while( rs.next() ) {

datas[idx++]=rs.getString("job");
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
System.out.println( "에러 " + e1.getMessage() );
} catch (SQLException e1) {
// TODO Auto-generated catch block
System.out.println( "에러 " + e1.getMessage() );
} finally {
if( rs != null ) try { rs.close(); } catch(SQLException e1) {}
if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {}
if( conn != null ) try { conn.close(); } catch(SQLException e1) {}
}
return datas;
}

}

결과1

 

결과2

 

- 동적으로 할당할 때 배열의 크기를 확인하는 코드가 중요하다

 

EmpDAO.java - DAO로 분리 (DAO 동작을 처리하는 구간)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class EmpDAO {

private Connection conn;


public EmpDAO() {
String url = "jdbc:mariadb://localhost:3306/sample";
String user = "root";
String password = "!123456";

try {
Class.forName( "org.mariadb.jdbc.Driver" );
conn = DriverManager.getConnection(url, user, password);

} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
System.out.println( "에러 " + e1.getMessage() );
} catch (SQLException e1) {
// TODO Auto-generated catch block
System.out.println( "에러 " + e1.getMessage() );
}

}

public String[] listJob() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String[] datas =null;

try{
String sql = "select distinct job from emp";
pstmt = conn.prepareStatement( sql );

rs = pstmt.executeQuery();

rs.last(); //데이터 개수 확인 ( 중요)
int count = rs.getRow();
rs.beforeFirst();

datas = new String[count];
int idx=0;

while( rs.next() ) {

datas[idx++]=rs.getString("job");
}
}catch(SQLException e) {
System.out.println( "에러 " + e.getMessage() );
}finally {
if( rs != null ) try { rs.close(); } catch(SQLException e1) {}
if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {}
if( conn != null ) try { conn.close(); } catch(SQLException e1) {}
}

return datas;

}
}

 

CustomSpinnerListModel.java - 객체 생성
import javax.swing.SpinnerListModel;


public class CustomSpinnerListModel extends SpinnerListModel {


public CustomSpinnerListModel() {

super( new EmpDAO().listJob());

}
}

 


Combobox

JComboBoxEx01.java - Combobox로 과일 선택하기
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class JComboBoxEx01 extends JFrame {

private JPanel contentPane;
private JComboBox comboBox;

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

/**
 * Create the frame.
 */
public JComboBoxEx01() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

comboBox = new JComboBox();
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange()==ItemEvent.SELECTED) {  //선택된 내용만 뜰 수 있도록 설정해주어야 한다. 그렇지 않으면 클릭내용과 선택후 내용이 같이 떠서 중복으로 내용이 뜨게 된다.
System.out.println((String)comboBox.getSelectedItem());
}
}
});
//comboBox.setModel(new DefaultComboBoxModel(new String[] {"사과", "참외", "수박 ", "딸기"}));   //어떻게 데이터를 넣을것인지
comboBox.setModel(new CustomComboboxEx01());
comboBox.setSelectedIndex(0);   //처음에 어떤 데이터를 셋팅할건지
comboBox.setBounds(12, 10, 175, 23);
contentPane.add(comboBox);

JButton btn1 = new JButton("New button");
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(comboBox.getSelectedIndex());
System.out.println((String)comboBox.getSelectedItem());
}
});
btn1.setBounds(12, 43, 175, 23);
contentPane.add(btn1);
}
}

=> combobox에는 데이터를 넣을 때 DefaultComboBoxModel을 사용하여 직접적으로 넣는 방식이 있는가 하면, CustomComboboxModel을 통해 데이터베이스에서 따로 데이터를 가져와 넣는 방식이 있다.

 

CustomComboboxEx01.java - JCombobox에 적용할 수 있는 커스텀Combobox  (String 사용)
import javax.swing.DefaultComboBoxModel;


public class CustomComboboxEx01 extends DefaultComboBoxModel<String> {


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

//Callback 메서드 -> 개발자가 호출하는 것이 아닌 시스템에 의해 호출
@Override
public int getSize() {
// TODO Auto-generated method stub
System.out.println("getSize() 호출");
return items.length;
}

@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
System.out.println("getElementAt() 호출");
return items[index];
}
}

 

CustomComboboxEx02.java - JCombobox에 적용할 수 있는 커스텀Combobox(2)  (ArrayList사용)
import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;

public class CustomComboboxEx02 extends DefaultComboBoxModel<String> {

private ArrayList<String> items;


public CustomComboboxEx02() {
items= new ArrayList<String>();
items.add("과일선택");      // 맨 처음 출력되는 것이 과일선택이 될 수 있도록 함
items.add("사과");
items.add("참외");
items.add("수박");
items.add("딸기");
}

@Override
public int getSize() {
// TODO Auto-generated method stub
//System.out.println("getSize() 호출");
return items.size();
}

@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
//System.out.println("getElementAt() 호출");
return items.get(index);
}
}

=> ArrayList를 사용하던 String을 사용하던 JComboBox프로젝트 코드는 따로 바뀌지 않고 setModel에서 어느 CustomCombobox를 사용할것인지만 정하면 된다.

=> 또한 Custom에서 String을 사용하면 size는 .length로 확인, element는  [index]로 확인해야한다.

     반면 Custom에서 ArrayList를 사용하면 size는 .size()를 사용하고, element는 .get(index)를 사용한다.

 

 


 

=> CustomComboBox에서 EmpDAO를 사용하여 데이터베이스 안에 있는 데이터를 가져와 ComboBox안에 넣을 수 있다.

CustomComboboxModel.java - ArrayList로 작성
import java.util.ArrayList;


import javax.swing.DefaultComboBoxModel;


public class CustomComboboxModel extends DefaultComboBoxModel<String> {
//private String[] datas;
private ArrayList<String> datas;
public CustomComboboxModel() {
EmpDAO2 dao = new EmpDAO2();
datas = dao.listJob();
}

@Override
public int getSize() {


return datas.size();
}

@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
//System.out.println("getElementAt() 호출");
return datas.get(index);
}

}

 

JComboBoxEx03.java  - CustomComboboxModel.java를 사용한 본 클래스
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerListModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class JComboBoxEx03 extends JFrame {

private JPanel contentPane;
private JTextArea textArea;
private JComboBox comboBox;
/**
 * Launch the application.
 */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JComboBoxEx03 frame = new JComboBoxEx03();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
 * Create the frame.
 */
public JComboBoxEx03() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 600, 800);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);
contentPane.setLayout(null);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(26, 68, 532, 559);
contentPane.add(scrollPane);

textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea);

comboBox = new JComboBox();
comboBox.setModel(new CustomComboboxModel());
comboBox.setSelectedIndex(0);
comboBox.setBounds(26, 25, 532, 23);
contentPane.add(comboBox);
}



}

 

우편번호 검색기

시도 

구군


 

728x90
반응형

'Programming > JAVA' 카테고리의 다른 글

[JAVA]GUI(5) - Layout  (0) 2023.09.18
[JAVA] GUI(4)  (0) 2023.09.15
[JAVA] GUI(2)  (0) 2023.09.12
[JAVA] 멀티스레드 + GUI(1)  (0) 2023.09.12
[JAVA] Data/객체 입출력  (0) 2023.09.01