質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

JTableでDBにデータを登録したいです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,251
退会済みユーザー

退会済みユーザー

前提・実現したいこと

JTableでDBにデータを登録したいです。

該当のソースコード

package Main;

import java.awt.BorderLayout;

import java.awt.Font;
import java.awt.Insets;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.DefaultCellEditor;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import DBManager.DBManager;
public class regist extends Top{
    String[][] data;
    int  nCol, nRow;
    BorderLayout frame = new BorderLayout();
    private String employee_name=null;
    private String postal_code=null;
    private String address=null;
    private String phone_number=null;
    private String mobile_number=null;
    private int employee_id =0;
    private String header[] = new String[nCol];
    public regist(final String sqldb, final String sqltable) throws Exception,SQLException {
        JToolBar toolBar = new JToolBar();
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        toolBar.setFloatable(true);
        toolBar.setMargin(new Insets(0,0,0,0));
        p.setLayout(new BorderLayout());
        p.getLayout();
        TableModel dataModel = new AbstractTableModel() {
            private static final long serialVersionUID = 1L;
            public int getColumnCount() { return header.length; }
            public int getRowCount()    { return data.length; }
            public boolean isCellEditable(int row, int col) { return true; }
            public Object getValueAt(int row, int col) { return data[row][col]; }
            public void setValueAt(Object val, int row, int col) {
                data[row][col] = (String)val;
                try { updateData(sqldb, sqltable, row, col); }
                catch (Exception e) { System.out.println(e.getMessage()); }
            }
            public String getColumnName(int col) { return header[col]; }
        };
        JTable table = new JTable(dataModel);
        JTableHeader jh = table.getTableHeader();
        jh.setFont(new Font(jh.getFont().getFamily(),Font.PLAIN,18));
        table.setFont(new Font(jh.getFont().getFamily(),Font.PLAIN,18));
        table.setRowHeight(22);
        JTextField Text = new JTextField();
        Text.setFont(new Font(jh.getFont().getFamily(), Font.PLAIN, 18));
        table.setDefaultEditor(Object.class, new DefaultCellEditor(Text));
    }
    public regist() {
    }
    void loadData(String database, String table) throws Exception,SQLException {
        header[0]="ID";
        header[1]="名前";
        header[2]="郵便番号";
        header[3]="住所";
        header[4]="電話番号";
        header[5]="携帯番号";
    }
    void updateData(String database, String table, int row, int col) throws Exception,SQLException {
        header[0]="employee_id";
        header[1]="employee_name";
        header[2]="postal_code";
        header[3]="address";
        header[4]="phone_number";
        header[5]="mobile_number";
        Connection con =DBManager.getConnection();
        String sql = "INSERT INTO  " + table + " VALUES (?,?,?,?,?,?)";
                PreparedStatement ps = con.prepareStatement(sql);
                ps.execute(sql);

    }





    void printFunction()throws Exception,SQLException {
        String db = "D:/PostgreSQL/9.5/bin";
        String table = "employee";
        new JTableFrame(db, table).setVisible(true);

    }
}
package DBManager;

import java.sql.Connection;
import java.sql.DriverManager;


public class DBManager {
    public static Connection getConnection(){
        try{
            Class.forName("org.postgresql.Driver");
            Connection con =
                    DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres",    // データベース名
                            "postgres",                    // 接続ユーザ名
                            "abcd");
            return con;
        }catch(Exception e){
            throw new IllegalStateException(e);
        }
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

jdk 1.7.0_80
postgreSQL9.5
eclipse4.5
データの表示、更新はできるのですが、新規登録ができません。
どなたかご教示願います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/09/19 05:39

    ありがとうございます。行を追加して登録する方法がわかりましたら教えていただけると、さらに助かります。よろしくお願い致します。

    キャンセル

  • ijufumi

    2016/09/21 18:35

    「新規登録ができない」というのは、「プログラムは正常終了するけど、DBに登録できていない」「プログラムが異常終了する(エラーが発生する)」のどちらでしょうか?
    また、「更新はできる」とはDBの更新でしょうか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/09/21 21:52

    新規登録につきましては、空白の行を追加して新規登録をするためのプログラムの記述方法がわかりません。更新につきましては、JTableのセルを更新すると、DBも更新されます。

    キャンセル

回答 2

checkベストアンサー

0

返事への回答だときれいにコードを表示できなかったので、新規の回答として投稿します。

テーブルに行を追加するだけの簡単なサンプルです。
レコードの追加部分を参考にしてもらえたら嬉しいです。

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class TableWindow extends JFrame {

    private static final String[] COLUMN_NAMES = {"ID", "NAME", "SEX"};
    private static final String[][] INITIAL_DATA = {{"1", "John", "Male"}, {"2", "Lisa", "Female"}};

    public TableWindow() {
        setTitle("Test");
        setSize(new Dimension(400, 200));

        JPanel mainPanel = new JPanel(new FlowLayout());
        DefaultTableModel tableModel = new DefaultTableModel(INITIAL_DATA, COLUMN_NAMES);
        tableModel.addTableModelListener(e -> {
            if (e.getType() == TableModelEvent.INSERT) {
                insertRecord();
            }
            else if (e.getType() == TableModelEvent.UPDATE) {
                updateRecord();
            }
        });

        JTable table = new JTable(tableModel);
        mainPanel.add(table);

        JButton insertButton = new JButton("Add");
        insertButton.addActionListener(e -> {
            // ここで画面などを使い、登録するデータを入力させる

            // 入力した値を元に行を追加する
            tableModel.addRow(new Object[]{});
        });
        mainPanel.add(insertButton);

        getContentPane().add(mainPanel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void insertRecord() {
        System.out.println("insert");
    }

    private void updateRecord() {
        System.out.println("update");
    }
}

 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

行を追加する場合、ボタンなどを押して行うと思いますので、
そのイベントの時にINSERTを実行したらどうでしょうか?

JButton registButton = new JButton("追加");
registButton.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e) {
    // ここでJTableにデータ追加及びINSERT処理を記述
  }
});

あと、TableModelはDefaultTableModelを使った方が、
データの追加はしやすそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/22 21:09

    ありがとうございます。
    すみませんが、短くてもかまいませんので、サンプルプログラムを教えていただけませんでしょうか。うまくプログラムに反映させることができませんでした。

    キャンセル

  • この投稿は削除されました

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る