안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

레이블이 단어장인 게시물을 표시합니다. 모든 게시물 표시
레이블이 단어장인 게시물을 표시합니다. 모든 게시물 표시

2011년 8월 14일 일요일

[단어장] Source - Error.java


package dictionary;

public class Error {

// A - Z 65 - 90
// a - z 97 - 122
public static boolean ECheck(String e) {
int length = e.length();
boolean t = false;
for (int i = 0; i < length; i++) {
char temp = e.charAt(i);
if (temp < 32) {
t = true;
break;
} else if (temp > 32 && temp < 65) {
t = true;
break;
} else if (temp > 90 && temp < 97) {
t = true;
break;
} else if (temp > 122) {
t = true;
break;
}
}

if (length == 0) {
t = true;
}
return t;
}
}

이 부분은 단어장에 영어단어를 입력 시 영어를 입력하는 지 아닌지

 확인하는 처리를 해준 것이다.

[단어장] Source - DTable.java


package dictionary;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

/*query = "create table Word " + "(name varchar(32), "
 + "mean varchar(200), " + "importance TINYINT , "
 + "count SMALLINT)";*/
public class DTable {
private static Connection con = null;
private static Statement stmt = null;
private static JTable table = null;
private JFrame frame = new JFrame();

private DefaultTableModel model = new DefaultTableModel();

public JFrame getFrame(){
return frame;
}

public JTable getTable(){
return table;
}
public DefaultTableModel getDModel(){
return model;
}
public void showWords() {
// Frame
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Table

table = new JTable(model);
table.getSelectionModel().addListSelectionListener(new RowListener());
D_DB.setTable(table, model);

JScrollPane scrollPane = new JScrollPane(table);
// Save
JPanel panel = new JPanel();
JButton button = new JButton("Save");
button.addActionListener(new SaveListener());
panel.add(button);

// 위치 조정
frame.getContentPane().add(panel, BorderLayout.NORTH);
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
frame.setBounds(50, 50, 300, 300);
frame.setVisible(true);

}

class SaveListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
Dictionary d = new Dictionary();
d.createAndShowGUI();
}
}

class RowListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
if (table.getSelectionModel().isSelectionEmpty() == false) {
int row = table.getSelectionModel().getLeadSelectionIndex();
int col = table.getColumnModel().getSelectionModel()
.getLeadSelectionIndex();

String word = (String) table.getValueAt(row, col);
String[] data = new String[2];
D_DB.getData(data, word);

if (data[0] != null && data[1] != null) {
Dictionary d = new Dictionary(data[0], data[1]);
d.createAndShowGUI();
}
}

}
}

}

 이 부분은 단어장을 나타낸다. 즉 Dictionary Form에서 저장해 놓은 단어들을 

 보여주는 부분이다. 이를 Table에 나타내도록 하였다.

 Table 에서 해당 줄을 클릭하면 그 단어의 뜻을 보여주는 창을 띄우도록

 하였고 이를 위해서 Listener를 사용하였다.

 

[단어장] Source - Dictionary.java


package dictionary;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class Dictionary {
JFrame frame;
JPanel English;
JPanel Meaning;
JPanel Save;
JLabel word;
JTextField eword = null;
JLabel mean;
JTextArea emean = null;
JButton save;
JButton ok;
JButton delete;
boolean isNew = true;

//Table
static DTable table = new DTable();
Dictionary() {
}

Dictionary(String name, String mean) {
eword = new JTextField(20);
eword.setText(name);
emean = new JTextArea(10, 20);
emean.setText(mean);
isNew = false;
}

public static void main(String[] args) {
table.showWords();
}

public void createAndShowGUI() {
// Frame
frame = new JFrame("Dictionary");
English = new JPanel();
Meaning = new JPanel();
Save = new JPanel();
word = new JLabel("영어");
if (eword == null)
eword = new JTextField(20);
mean = new JLabel(" 뜻 ");
if (emean == null)
emean = new JTextArea(10, 20);

// add Panel
English.add(word);
English.add(eword);
Meaning.add(mean);
Meaning.add(emean);

// add Button
if (isNew == true) {
save = new JButton("Save");
save.addActionListener(new SaveListener());
ok = new JButton("Cancel");
ok.addActionListener(new OkListener());
Save.add(save);
Save.add(ok);
}else
{
delete = new JButton("Delete");
delete.addActionListener(new DeleteListener());
JButton ok = new JButton("OK");
ok.addActionListener(new OkListener());
Save.add(delete);
Save.add(ok);
}
frame.getContentPane().add(BorderLayout.NORTH, English);
frame.getContentPane().add(BorderLayout.CENTER, Meaning);
frame.getContentPane().add(BorderLayout.SOUTH, Save);
frame.pack();
frame.setVisible(true);
}

class OkListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
frame.setVisible(false);
table.getTable().getSelectionModel().clearSelection();
}
}

class DeleteListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
String ew = eword.getText();
String em = emean.getText();

D_DB.DeleteWord(ew);

frame.setVisible(false);
int row = table.getTable().getSelectionModel()
.getLeadSelectionIndex();

table.getDModel().removeRow(row);
table.getTable().getSelectionModel().clearSelection();
}
}

class SaveListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
String ew = eword.getText();
String em = emean.getText();

if (Error.ECheck(ew) == false) {
D_DB.insertWord(ew, em, 1);

D_DB.showTable();

System.out.println(ew + " " + em);

frame.setVisible(false);
DefaultTableModel model = table.getDModel();
model.addRow(new Object[] { ew });
} else {
JOptionPane.showMessageDialog(null, "'영어'란에 영어만 입력하세요");
}

}
}

}

 단어장에 단어를 입력하는 폼을 만든 것이다.

 Frame 과 Panel을 이용해서 구성되어 있다. 

 createAndShowGUI() Method에서 구현하고 있다.

 frame 을 만들고 거기에 English 와 Meaning 패널을 집어 넣는다.

 English 패널에는 word JLabel과 eword JTextField를 집어 넣어서 

 영어 단어를 적게 만들었고

 Meaning 필드에는 JLabel 과 JTextAread를 이용해서 뜻을 넣도록

 하였다. 

 그리고 사실 이 동일 클래스에서 두가지 상황을 가능하게 만들었다.

 그래서 만약 입력 하는 단계라면 버튼이 Save 와 Cancel이 나오게

 함과 동시에 단어 입력을 가능하게 하였다. 반면 입력하는 단계가

 아닐 경우 (단어장에서 해당 단어를 클릭 했을 때) 그 단어의 영어
 
 와 뜻을 보여줌과 동시에 삭제 기능과 확인 기능 (Delete 와 OK) 버튼

 을 넣도록 구현 하였다. 

 Listener에서 관련 내용을 다루고 있다
 

2011년 8월 11일 목요일

[단어장] Java로 간단한 단어장을 만들어 보자.

 소스와 함께 간단하게 단어장을 만들어 보자.

 일단 단어장을 만들기 위해서 뭐가 필요할지에 대해 이야기 해 보겠다.

 1. 단어장을 만들기 위해서는 단어들을 저장할 DB가 필요하고

 2. 단어장에 넣을 단어들을 입력하기 위한 GUI 창이 필요하고

 3. 단어들을 보여줄 GUI가 필요하다.

 이 세 가지만 다룰 줄 안다면 간단하게 단어장을 만들 수 있다.

 1. DB 다루기

 MySql과 JDBC를 이용하여 자바에서 DB를 사용하도록 하자.

 MySql 과 JDBC를 저장하는 방법은 블로그 내 다른 글을 참조하도록 하자.

 그럼 이제 단어장을 만들기 위해 필요한 DB 연산 기능을 생각해 보자.

 우선 무엇보다도 저장할 공간 즉 Table이 필요하다.

 이를 위해서는 Create Table을 이용하여 DB를 만들어야 한다.

 그 후 입력한 단어들을 저장하기 위해서 Insert 문을 사용하게 된다.

 그리고 사용자가 원하는 단어를 뽑기 우해서 Select 문을 사용하고

 필요없는 단어를 지우기 위해 Delete 문을 사용하여야 한다.

 이 정도 기본적인 Sql 문들을 이용할 줄 알고 이를 Java에서 나타내기 위해

 JDBC를 잘 이용한다면 DB 구축은 쉽게 할 수 있다.

 현재 본인이 만들어 놓은 단어장에 들어 있는 DB 관련 소스이다.


package dictionary;

import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import dictionary.DTable.RowListener;

public class D_DB {

static Connection con = null;
static Statement stmt = null;

static String userid = "root", password = "root";
static String url = "jdbc:mysql://localhost:3306/test";

public static Connection getConnection() {

try {
Class.forName("org.gjt.mm.mysql.Driver"); // Class.forName("myDriver.ClassName");
// ?

} catch (java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}

try {
con = DriverManager.getConnection(url, userid, password);

} catch (SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}

return con;
}

public static void createTables() {
Connection con = getConnection();
String query;
Statement stmt;

try {
query = "create table Word " + "(name varchar(32), "
+ "mean varchar(200), " + "importance TINYINT , "
+ "count SMALLINT)";
stmt = con.createStatement();
stmt.executeUpdate(query);
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void insertWord(String word, String mean, int importance) {
Connection con = getConnection();

String insert = "insert into Word values('" + word + "', '" + mean
+ "', " + importance + ", " + 1 + ")";
String select = "SELECT name, count FROM Word WHERE name = '" + word + "'";

try {

stmt = con.createStatement();
ResultSet result = stmt.executeQuery(select);
if (result.first() == false) {
stmt.executeUpdate(insert);
} else {
int count = result.getInt(2);
count++;
String update = "update Word set mean = '" + mean + "', count = " + count
+ " where name = '" + word+ "'";

stmt.executeUpdate(update);
}

stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void showTable() {
Connection con = getConnection();

String select = "SELECT * FROM Word ";

try {
stmt = con.createStatement();
ResultSet result = stmt.executeQuery(select);

while(result.next()){
String word = result.getString(1);
String mean = result.getString(2);
int imp = result.getInt(3);
int count = result.getInt(4);

System.out.println("영어 단어 " + word + " 영어 뜻 " +
mean + " 중요도" + imp + " 저장횟수 " + count);
}
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void DeleteWord(String word) {
Connection con = getConnection();

String delete = "DELETE FROM Word where name = '" + word + "'";

try {
stmt = con.createStatement();
stmt.executeUpdate(delete);

stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void setTable(JTable table,DefaultTableModel model) {
Connection con = D_DB.getConnection();
String select = "SELECT name FROM Word";

String title = "word";

try {
stmt = con.createStatement();
ResultSet result = stmt.executeQuery(select);

model.addColumn(title);
while (result.next()) {
String word = result.getString(1);

model.addRow(new Object[] { word });

}
stmt.close();
con.close();

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void getData(String[] data, String word){
Connection con = getConnection();

String select = "SELECT name,mean FROM Word where name = '" +
word + "'";

try {
stmt = con.createStatement();
ResultSet result = stmt.executeQuery(select);

while(result.next()){
data[0] = result.getString(1);
data[1] = result.getString(2);
}
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


 이 Code를 D_DB.java 라는 클래스를 새로 만든 후 붙여 넣으면 된다.

 질문 사항이 있으면 댓글을 달아주시기 바랍니다.

 다음 번에는 단어장을 만들 때 필요한 GUI를 만드는 방법을 알려드리겠

 습니다.