プロが教える店舗&オフィスのセキュリティ対策術

javaのプログラムで入力項目をDBに書き込むというプログラムを作成しているのですが、
コンソール形式だと成功するのですが、テキストボックスなどをおいて、GUI形式でやろうとするとキーイベントの中の変数ににうまく値が参照されません
以下ソース

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

class meibo3 extends JFrame implements KeyListener {
public static void main(String args[]) {
meibo3 frame = new meibo3("タイトル");
frame.setVisible(true);
}



//private String name;
//private String shu;
//private int id;
//private int su;

meibo3(String title) {
setTitle(title);
setBounds(100, 100, 300, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel p = new JPanel();
p.setLayout(null);

JLabel lmeibo = new JLabel("【名簿入力】", SwingConstants.CENTER);
lmeibo.setBounds(100, 10, 80, 30);
JLabel lgakuno = new JLabel("学生番号", SwingConstants.CENTER);
lgakuno.setBounds(30, 40, 80, 30);
JLabel lname = new JLabel("氏 名", SwingConstants.CENTER);
lname.setBounds(200, 40, 80, 30);
JLabel lshu = new JLabel("入力を終了しますか?(Y/N)");
lshu.setBounds(30, 120, 200, 30);

JTextField gaku = new JTextField(4);
gaku.setBounds(30, 70, 80, 30);
JTextField namae = new JTextField(20);
namae.setBounds(200, 70, 80, 30);
JTextField y = new JTextField(20);
y.setBounds(200, 120, 20, 30);
y.addKeyListener(this);
;
p.add(lmeibo);
p.add(lgakuno);
p.add(lname);
p.add(gaku);
p.add(namae);
p.add(y);
p.add(lshu);
Container contentPane = getContentPane();
contentPane.add(p, BorderLayout.CENTER);

int id = Integer.valueOf(gaku.getText()).intValue();
String name = namae.getText();
int nsu = namae.getText().length();
String yn =y.getText();

//method(id,name,nsu,yn);

}

public void keyPressed(KeyEvent ke) {
// TODO 自動生成されたメソッド・スタブ

if (ke.getKeyCode() == ke.VK_ENTER) {


//private void method(int id, String name, int nsu, String yn){
Date d = new Date();
SimpleDateFormat dfd = new SimpleDateFormat("yyyy-MM-dd");
Connection con = null;
String day = dfd.format(d);
// System.out.print(day);
PreparedStatement ps = null;


try {

// ドライバクラスをロード
Class.forName("com.mysql.jdbc.Driver");

// データベースへ接続
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/hellodb", "root",
"root");
Statement stmt = (Statement) con.createStatement();
// name,bloodType,ageのデータを検索するSQL文を作成
String sql = "INSERT INTO hellodb.meibo VALUES(" + id
+ ",'" + name + "','" + day + "');";
System.out.println(sql);

if (id > 4 && nsu > 20) {
// JOptionPane.showMessageDialog(this, "学生番号が4桁以上、氏名が20文字以上になっています。", "Error",
// JOptionPane.ERROR_MESSAGE);
} else {

if (id < 5) {
// JOptionPane.showMessageDialog(this,
// "学生番号が4桁以上になっています", "Error",
// JOptionPane.ERROR_MESSAGE);

} else {

if (nsu > 20) {
// JOptionPane.showMessageDialog(this,
// "氏名が20文字以上になっています。", "Error",
// JOptionPane.ERROR_MESSAGE);
} else {

if (yn.equals("y") || yn.equals("y")
|| yn.equals("Y") || yn.equals("Y")) {

// ps = con.prepareStatement(sql);
stmt.execute(sql);
// JOptionPane.showMessageDialog(this,
// "成功しました", "Info",
// JOptionPane.INFORMATION_MESSAGE);
} else if (yn.equals("n") || yn.equals("n")
|| yn.equals("N") || yn.equals("N")) {

}
}
}

}


} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {

// close処理
if (ps != null) {
ps.close();
}

// close処理
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}






public void keyReleased(KeyEvent arg0) {
// TODO 自動生成されたメソッド・スタブ

}

public void keyTyped(KeyEvent arg0) {
// TOD

A 回答 (1件)

meibo3(String title)の中でint id = Integer.valueOf(gaku.getText()).intValue();などを実行していますが、この時点ではJTextFieldにまだ何も入力されていないはずです。

入力が終わってからJTextFieldの内容を参照してください。
それから、KeyListenerをセットしていないのでkeyPressed(KeyEvent ke)は呼ばれることがありません。
    • good
    • 0
この回答へのお礼

なるほどです。
ありがとうございます。
あれから、いろいろぐぐってみたら、アクションイベントで実装することができました。

お礼日時:2013/05/02 16:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!