Java๋ด์ ๋ด์ฅ๋์ด์๋ GUI์ธ ์ค์(swing)์ ์ด์ฉํ์ฌ ๊ฐ๋จํ ํ ์ด ํ๋ก๊ทธ๋จ(๊ฐ๊ณ๋ถ ํ๋ก์ ํธ)์ ์์ฑํ์์ต๋๋ค.
์ด๋ค ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ์๊ฐํด์ผํ ๋ถ๋ถ์ด ์ด๋ค ๊ฒ ์์์ง ํ๊ณ ํ๊ธฐ ์ํด ๊ธฐ๋กํฉ๋๋ค.
ใใใ๋ฐ๋ก๊ฐ๊ธฐ
- ๋ก๊ทธ์ธ
- ํ์๊ฐ์
- ํ ์คํธ ํ๋ ํํธ ์ฝ์
- ํ ์ด๋ธ ๋ฐ์ดํฐ ์ฝ์
- ํ ์ด๋ธ ์๋ก๊ณ ์นจ
- ํ ์ด๋ธ ํ ์ญ์
โถ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
์์ด๋ ํน์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ธฐ์ ํ๋ ํ ์คํธํ๋(textfield)๊ฐ ๊ธฐ์ ๋์ง ์์ผ๋ฉด ํ๋จ ๋ผ๋ฒจ์ ๊ฒฝ๊ณ ๋ฌธ์ ์์ฑ.
์ณ์ง ์์ ์์ด๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ ๋, ๊ฒฝ๊ณ ๋ฌธ GUI ์์ฑ.
๋ก๊ทธ์ธ ๋ฒํผ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ฉ์๋ actionListener ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ ํด์ฃผ๊ณ ํ ์คํธ๊ฐ ๋น์ด์์ ๋, ์ ํํ๋ idHint, pwHint ๋ฌธ์์ด๊ณผ ๋์ผํ ๊ฒฝ์ฐ ๋ผ๋ฒจ ๊ฒฝ๊ณ ๋ฌธ์ด ๋ณด์ผ ์ ์๊ฒ ํด ์คฌ๋ค.
์ถ๊ฐ๋ก ์ ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ DB์ ์ผ์นํ์ง ์์ ์์ด๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ค๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ ๋์ด์คฌ๋ค.
โป ์๋ก์ด GUI ๊ฒฝ๊ณ ์ฐฝ์ ๋์ฐ๋ ๊ฒ๋ณด๋ค๋ ํ๋จ ๋ผ๋ฒจ์ ๋ฌธ์์ด์ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ด์ ์ด ์์ง ์์๊น ์๊ฐํ๋ค.
ms๋ก ์์ฃผ ์งง์ ์๊ฐ์ด์ง๋ง ์ฑ๋ฅ์ ์ฐจ์ด๋ ํ์คํ๋ค. (์ค์ ์๋ ์ฐจ์ด ์ฝ 20~30๋ฐฐ)
โท ๋ก๊ทธ์ธ ๋ฒํผ(jButton1)์ "login"์ด๋ผ๋ ์ด๋ฆ์ actionListener ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ
jButton1.addActionListener(login); // login ์ด๋ฒคํธ ๋ฆฌ์ค๋
โท "login" actionListener ๊ฐ์ฒด ์ ์
// "๋ก๊ทธ์ธ" ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ
private ActionListener login = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String id = textField1.getText();
String pw = textField2.getText();
if (textField1.getText().equals(idHint) || textField2.getText().equals(pwHint)) {
jLabel4.setVisible(true);
} else {
if (bd.checkIdPw(id, pw)) {
System.out.println("์์ด๋ ํ์ธ");
jLabel1.setVisible(false);
new SelectAllGui(id);
dispose();
} else {
System.out.println("๋ก๊ทธ์ธ ์ค๋ฅ");
jLabel4.setVisible(true);
JOptionPane.showMessageDialog(null, "์์ด๋ ๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ์ธ์!");
}
}
}
}; // end login trigger
1. ๋ก๊ทธ์ธ ๋ฒํผ์ด ๋๋ฆฌ๋ ์๊ฐ id์ pw ํ ์คํธ ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
2. ๊ฐ ํ ์คํธ ํ๋์ ๊ฐ์ด idHint(ํ ์คํธ ํ๋์ ๊ธฐ๋ณธ์ผ๋ก ์ฐ์ฌ์๋ ๋ฌธ๊ตฌ) ํน์ pwHint์ ์ผ์นํ๋ค๋ฉด ์จ๊ฒจ ๋์๋ ํ๋จ ๋ฌธ์์ด ๋ผ๋ฒจ(jLabel4)์ ๋ณด์ฌ์ค๋ค(". setVisible(true)").
3. ๋ ํ ์คํธ ํ๋์ ๊ฐ์ด ์๋ค๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์๋ id์ pw๋ฅผ DB์ ํ์ธํ๋ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
-> ์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ : id๋ฅผ ์ธ์๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
-> ์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด, ๊ฒฝ๊ณ ์ฐฝ์ ๋์ด์ค๋ค.(". showMessageDialog")
โถํ์๊ฐ์ ๊ธฐ๋ฅ
1. ๋ก๊ทธ์ธ๊ณผ ๋์ผํ๊ฒ ํ๋๋ผ๋ ๋น์ด์๋ ํ ์คํธ ํ๋๊ฐ ์กด์ฌ(ํํธ์ ๋์ผํ ๋ฌธ์์ด)ํ ๊ฒฝ์ฐ ํ๋จ์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅ.
2. DB์์ ์ ์ํ ํ๋์ ํฌ๊ธฐ๋ณด๋ค ๋ ํฐ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ์ ์๊ฒ ํ ์คํธ ํ๋์ ๋ฌธ์์ด์ ์ ํ.
3. "์ด๊ธฐํ" ๋ฒํผ ํด๋ฆญ ์ ํ ์คํธ ํ๋๋ฅผ ๋ชจ๋ "ํํธ"์ ๋์ผํ๊ฒ ๋ณ๊ฒฝ.
โท "ํ์๊ฐ์ " GUI์ ํฌํจ๋ "๋ฑ๋ก ๋ฒํผ"๊ณผ "์ด๊ธฐํ ๋ฒํผ" ์ด๋ฒคํธ
// "๋ฑ๋ก" ์ด๋ฒคํธ
private ActionListener userJoin = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jTextField1.getText().equals(idHint) || jTextField2.getText().equals(pwHint)
|| jTextField3.getText().equals(phHint) || jTextField4.getText().equals(nameHint)) {
jLabel6.setText("๋ชจ๋ ํญ๋ชฉ์ ์
๋ ฅํด์ฃผ์ธ์");
} else {
if (jTextField1.getText().length() > 10) {
jLabel6.setText("์์ด๋๊ฐ ๋๋ฌด ๊น๋๋ค.\n(์๋ฌธ, ์ซ์ ์กฐํฉ 10์ ์ด๋ด)");
} else if (jTextField2.getText().length() > 8) {
jLabel6.setText("๋น๋ฐ๋ฒํธ๊ฐ ๋๋ฌด ๊น๋๋ค.\n(์๋ฌธ, ์ซ์ ์กฐํฉ 8์ ์ด๋ด)");
} else if (jTextField3.getText().length() > 11) {
jLabel6.setText("์ ํ๋ฒํธ๊ฐ ๋๋ฌด ๊น๋๋ค.\n(์ซ์ 11์ ์ด๋ด)");
} else if (jTextField4.getText().length() > 8) {
jLabel6.setText("์ด๋ฆ์ด ๋๋ฌด ๊น๋๋ค.\n(ํ๊ธ 8์ ์ด๋ด)");
} else {
vo = new UserinfoVo(jTextField1.getText(), jTextField2.getText(), jTextField3.getText(),
jTextField4.getText());
bd = UserinfoDao.getInstance();
if (!bd.idcheck(vo.getId())) {
bd.insert(vo);
dispose();
} else {
JOptionPane.showMessageDialog(null, "์ด๋ฏธ ์กด์ฌํ๋ ์์ด๋์
๋๋ค");
}
}
}
}
}; // userJoin end
// "์ด๊ธฐํ" ๋ฒํผ ์ด๋ฒคํธ
private ActionListener initTextField = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jTextField1.setText(idHint);
jTextField2.setText(pwHint);
jTextField3.setText(phHint);
jTextField4.setText(nameHint);
}
}; // init end
โถํ ์คํธ ํ๋ ํํธ ์ฝ์
ํ ์คํธ ํ๋ ํํธ๋? ํ ์คํธ ํ๋ ์์ ์ํฐ๋งํฌ์ ๊ฐ์ด ์ค์ ๊ธฐ์ ๋ ๊ฐ์ ์๋์ง๋ง(null ์ญํ ) ์ฌ์ฉ์๊ฐ ํ์ธํ ์ ์๋ ํ ์คํธ์ ๋๋ค. ex) "์์ด๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์."
ํ ์คํธ ํํธ๋ ์ค์ ๋ ์กด์ฌํ์ง ์๋ ๊ฐ์ด ๋์ด์ผ ํ๊ธฐ์ ์๋์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํด์ผ ํฉ๋๋ค.
1. ํํธ์ ๋์ผํ ๋ฌธ์์ด์ null๋ก ์ทจ๊ธ.
2. ํ ์คํธ ํ๋์ ๊ฐ์ ๊ธฐ์ ํ๋ ค ํ ๋, ํํธ ๊ฐ์ด๋ผ๋ฉด ๋น์ด์๋ ํ ์คํธ ํ๋(๊ณต๋ฐฑ)๊ฐ ๋์ด์ผ ํจ.
3. ํ ์คํธ ํ๋์ ๊ฐ์ ๊ธฐ์ ํ๋ ์ค์ด๋ผ๋ฉด, ๊ทธ๋๋ก ์์ ์ด ๊ฐ๋ฅํด์ผ ํจ.
4. (์ต์ ) ์ฌ์ฉ์ ๊ธฐ์ ๊ฐ๊ณผ ํํธ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด์ ๋ค๋ฅธ ํฐํธ์ ํ ์คํธ ์์์ ์ฌ์ฉํจ.
Font gainFont = new Font("Tahoma", Font.PLAIN, 11);
Font lostFont = new Font("Tahoma", Font.ITALIC, 11);
textField1.setText(idHint); // ํ
์คํธ ํ๋ ํํธ์ ๊ธฐ๋ณธ ๋ฌธ์
textField1.setFont(lostFont); // ํ
์คํธ ํ๋ ํํธ์ ๊ธฐ๋ณธ ํฐํธ
textField1.setForeground(Color.GRAY); // ํ
์คํธ ํ๋ ํํธ์ ๊ธฐ๋ณธ ์์
textField1.addFocusListener(new FocusListener() { // ํ
์คํธ ํ๋ ํฌ์ปค์ค ์ ์ด๋ฒคํธ
@Override
public void focusLost(FocusEvent e) { // ํฌ์ปค์ค๋ฅผ ์์์ ๋,
if (textField1.getText().equals("")) {
textField1.setText(idHint);
textField1.setFont(lostFont);
textField1.setForeground(Color.GRAY);
}
}
@Override
public void focusGained(FocusEvent e) { // ํฌ์ปค์ค๋ฅผ ์ป์์ ๋,
if (textField1.getText().equals(idHint)) {
textField1.setText("");
textField1.setFont(gainFont);
textField1.setForeground(Color.BLACK);
}
}
});
์ด๋, ํ ์คํธ ํ๋์ ํฐํธ๊ฐ ๋ณ๊ฒฝ๋๊ฒ ๋๋ ๊ฒ ์ธ์ฝ๋ฉ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ ์คํธ ํ๋์ ์ฝ์ ๋ ๋ฐ์ดํฐ ์ค ํ๊ธ์ ๊ฐ์ ธ์์ผ ํ๋ค๋ฉด, ํ๊ธ์ ์ง์ํ๋ ํฐํธ๋ฅผ ์ฌ์ฉํด์ผ ์ค๋ฅ ๋ฐ์์ด ์๋ค. (ํ๊ธ์ ์ง์ ๊ธฐ์ ํ ๋, ๊นจ์ง ์ ์์ผ๋ ํ์ธํด์ผ ํ๋ค.)
๋์ ๊ฒฝ์ฐ, ํ๊ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, "Glum12" ํฐํธ๋ฅผ ์ฌ์ฉํ๋ค.
โถํ ์ด๋ธ ๋ฐ์ดํฐ ์ฝ์
private DefaultTableModel model;
private JTable jTable1;
private JScrollPane jScrollPane1;
List<String[]> rows;
String[][] data;
String[] columns;
// ArrayList์ธ rows๋ฅผ 2์ฐจ์ ๋ฐฐ์ด data๋ก ๋ณํ ํ ๋งคํ
rows = dao.getListById(id); // ๋ฐ์ดํฐ ํํ(ArrayList)
columns = new String[] { "์์
|์ง์ถ", "๋ ์ง", "๊ธ์ก", "๋ถ๋ฅ", "๋ฉ๋ชจ", "๊ณ์ข๋ฒํธ" , "IDX"}; // ์ปฌ๋ผ
data = rows.stream().toArray(String[][]::new); // ArrayList -> Array
// jTable1 ์์ฑ
model = new DefaultTableModel(data, columns); // ํ
์ด๋ธ์ ๋ถ์ผ ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ(๋ฐ์ดํฐ, ์ปฌ๋ผ)
jTable1 = new javax.swing.JTable(model); // ํ
์ด๋ธ ๊ฐ์ฒด ์์ฑ
jScrollPane1.setViewportView(jTable1); // ํจ๋์ ํ
์ด๋ธ ๋ถ์ด๊ธฐ
// jTable1 ์ปฌ๋ผ ๋ณ ์ ๋ ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable1.getModel());
jTable1.setRowSorter(sorter);
์ค์์์ ํ ์ด๋ธ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
1. ํ ์ด๋ธ์ ์ฝ์ผํ ํ(ํํ)๊ณผ ์ด(์นผ๋ผ)์ ์ธ์๋ก ๋ฐ์ ๋ชจ๋ธ(model) ๊ฐ์ฒด ์์ฑ
2. ์์ฑํ ๋ชจ๋ธ์ ์ธ์๋ก ๋ฐ์ ํ ์ด๋ธ(JTable) ๊ฐ์ฒด ์์ฑ
3. ์์ฑํ ๊ฐ์ฒด๋ฅผ ํจ๋์ ์ฝ์
์ฌ๊ธฐ์ ๋ชจ๋ธ(mode) ๊ฐ์ฒด์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ํ ๋ฐ์ดํฐ๋ ๋ฐฐ์ด(Array) ๊ฐ์ฒด์ฌ์ผ ํ๋๋ฐ ๋์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ArrayList๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ Array๋ก ๋ณํ(ArrayList -> Array)ํด์ผ ํ๋ ๋ถํฉ๋ฆฌ๊ฐ ์์๋ค.(ArrayList ์ธ "rows"๋ฅผ Array์ธ "data"๋ก ์บ์คํ (casting) ํ์)
=> ์ถ๊ฐ์ ์ผ๋ก ์์ ์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ (์ฑ๋ฅ์ ์ธก๋ฉด)
โถํ ์ด๋ธ ์๋ก๊ณ ์นจ
// "์๋ก๊ณ ์นจ" ์ด๋ฒคํธ
private void jButton2ActionPerformed(ActionEvent evt, String id) {
// query ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ DB์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด
InexDao dao = InexDao.getInstance();
// ์ list๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
rows = dao.getListById(id);
// columns = new String[] { "์์
|์ง์ถ", "๋ ์ง", "๊ธ์ก", "๋ถ๋ฅ", "๋ฉ๋ชจ", "๊ณ์ข๋ฒํธ" , "IDX"};
data = rows.stream().toArray(String[][]::new);
// ์ ๋ชจ๋ธ ์์ฑ ํ ํ
์ด๋ธ ์์ฑ
model = new DefaultTableModel(data, columns);
jTable1 = new JTable(model);
// jTable1 sort
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable1.getModel());
jTable1.setRowSorter(sorter);
jScrollPane1.setViewportView(jTable1);
}
"์๋ก๊ณ ์นจ" ๋ฒํผ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ํ ์ด๋ธ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ ์๋ก์ด ๋ชจ๋ธ(model) ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ๋๋ค์ ํ ์ด๋ธ(JTable)์ ์์ฑํ๋ ๊ฒ์ด๋ค.
cloumn์ ๊ฒฝ์ฐ ์ ์ญ ๋ณ์๋ก ์์ฑํ๋ค๋ฉด ๋ค์ ์์ฑํ ํ์๋ ์๋ค.
์นผ๋ผ ๋ณ ์ ๋ ฌ์ ๋ด๋นํ๋ "TableRowSorter" ์ญ์ ํ๋์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ ๊ฐ์ฒด์ ํจ๊ป ๋ค์ ์์ฑํด์ค๋ค.
์๋ก ์์ฑํ ํ ์ด๋ธ์ ๊ธฐ์กด์ ์๋ ํจ๋์ ๋ค์ ์ธํ ํด์ค์ผ๋ก์จ ์๋ก๊ณ ์นจ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
โถํ ์ด๋ธ ํ ์ญ์
โท์ญ์ ๊ธฐ๋ฅ
1. ์ญ์ ๋ฅผ ์ํ๋ ํํ์ ์ ํํ๋ค.
2. ์ญ์ ๋ฒํผ ํด๋ฆญ -> ํ ์ด๋ธ์์ ์ญ์ ๋ ํ DB์ ์ ์ฉ.
// "์ญ์ " ์ด๋ฒคํธ
private void jButton3ActionPerformed(ActionEvent evt) {
int row = jTable1.getSelectedRow(); // ์ ํ๋ ํ ๋ฒํธ
int idx = Integer.valueOf((String)jTable1.getValueAt(row, 6)); // ์ ํ๋ ํ, ์ด์ ๋ฐ์ดํฐ ๊ฐ
InexDao dao = new InexDao(); // DB ์กฐ์์ ์ํ ๊ฐ์ฒด ์์ฑ
model.removeRow(row); // ๋ชจ๋ธ์ ํ ์ญ์
dao.delete(idx); // DB์ญ์ ๋ฉ์๋
System.out.println(row +" "+ idx); // ํ, ์ญ์ ์กฐ๊ฑด ๋ฐ์ดํฐ ๊ฐ ์ถ๋ ฅ(ํ์ธ์ฉ)
}
ํ์ฌ ๋ชจ๋ธ(model)์์ ํ์ ์ญ์ ํ๋ ๋ด์ฅ ๋ฉ์๋(removeRow(์ญ์ ํ ํ))์ ์ฌ์ฉํ๋ฉด GUI ํ ์ด๋ธ์ ๋ฐ๋ก ์ ์ฉ๋๋ค.
(๋ง์ฝ, ํํฐ ๊ธฐ๋ฅ์ ์ด์ฉํด์ ์นผ๋ผ ๋ณ ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ๋ฐ๋ก ์ ์ฉ๋์ง ์๋๋ค.)
getSelectedRow() ํจ์๋ฅผ ์ด์ฉํ๋ฉด jTable์์ ์ ํ๋ ํ์ ๋ฐํํ๋ค. ๋ง์ฝ, ํ ์ด๋ธ์ด setEnable(false)๋ก ์ค์ ๋์ด์๋ค๋ฉด ํ์ด ์ ํ๋์ง ์์ผ๋ฏ๋ก setEnable(true)๋ก ๋ณ๊ฒฝํด ์ค๋ค.
remoeRow์ DB์๋ ์ ์ฉ๋๋ ๊ฒ์ด ์๋๊ธฐ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ DB์ญ์ ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ์์ ์ธ์์ ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์ด์ (0) | 2022.04.05 |
---|---|
[Java] XMLํ์ผ๊ณผ ์๋ฐ(Java)๋ก ํ์ฑ(parsing)ํ๊ธฐ (0) | 2021.12.29 |
์๋ฐ[Java] ์ ์ถ๋ ฅ Stream ์ดํดํ๊ธฐ (0) | 2021.12.29 |
์๋ฐ[Java] ์ธํฐํ์ด์ค[Interface] ์ฌ์ฉ๊ณผ ์ด์ (1) | 2021.12.29 |
์๋ฐ[Java] ์ ๊ทผ ์ ์ด์[Access modifier] (0) | 2021.12.29 |