Avatar billede DonSkoD Juniormester
12. september 2012 - 12:31 Der er 6 kommentarer og
1 løsning

Populate jTable fra MySQL

Hej E

Jeg er nybegynder til Java. Benytter NetBeans til udviklingen.

Jeg er ved at oprette en lille Swing-app, hvor man kan indsætte og hente data fra en MySQL database.

Ideen er at lave et TextField, en Button og et jTable. Når brugeren så indtaster sit ID i textfield og derefter trykker på Button'en, sender den en Query til MySQL databasen "SELECT bla,bla,bla FROM table WHERE ID="+TextField.getText()+"'";...

Den henter herefter data til et ResultSet, og nu vil jeg gerne have den til at udfylde min jTable, men hvordan gør jeg det?

Jeg har læst mange tutorials, men jeg fatter det åbenbart ikke..
(Husk på at min jTable allerede er oprettet via Netbeans GUI).

Skriv hvis i skal bruge min kode.

Mvh.
Søren
Avatar billede arne_v Ekspert
12. september 2012 - 13:54 #1
Du smider data over i en model og kalder setModel paa din JTable.
Avatar billede DonSkoD Juniormester
12. september 2012 - 20:28 #2
Okay, har også læst lidt om det, men er lidt i tvivl om hvordan jeg skal gøre det.. Koden for min "button pressed" er nu som følger:

private void HentTimesedlerButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        // TODO add your handling code here:
        try {
            String selectQuery = "SELECT LonNr,Navn,Dato,StartTime,SlutTime,Oprettet FROM javaapp_timesedler WHERE LonNr = '" + HentTimesedlerTextField.getText() + "'";

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(dbcon + dbname, username, password);

            statement = conn.createStatement();
            rs = statement.executeQuery(selectQuery);


            rs.close();
            statement.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    } 


Hvor er det jeg skal sætte koden ind?
Avatar billede arne_v Ekspert
12. september 2012 - 21:15 #3
Jeg kan proeve og bixe et eksempel.
Avatar billede arne_v Ekspert
12. september 2012 - 21:54 #4
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class TableFromDatabase extends JFrame {
    private static final long serialVersionUID = 1L;
    private JTable tbl;
    private JButton btn;
    public TableFromDatabase() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Table from database");
        tbl = new JTable();
        getContentPane().add(new JScrollPane(tbl), BorderLayout.CENTER);
        btn = new JButton("Read from database");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                tbl.setModel(loadQuery("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/Test", "root", "", "SELECT f1,f2 FROM t1"));
            }
        });
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    TableModel loadQuery(String driver, String conurl, String un, String pw, String sql) {
        GeneralDatabaseModel res = new GeneralDatabaseModel();
        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(conurl, un, pw);
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
            for(int colix = 1; colix <= rsmd.getColumnCount(); colix++) {
                res.addColumn(rsmd.getColumnName(colix));
            }
            while(rs.next()) {
                List<Object> row = new ArrayList<Object>();
                for(int colix = 1; colix <= rsmd.getColumnCount(); colix++) {
                    row.add(rs.getObject(colix));
                }
                res.addRow(row);
            }
            rs.close();
            stmt.close();
            con.close();
            return res;
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
            return null;
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
            return null;
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new TableFromDatabase();
                f.setVisible(true);
            }
        });
    }
}

class GeneralDatabaseModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private List<String> colnams;
    private List<List<Object>> data;
    public GeneralDatabaseModel() {
        colnams = new ArrayList<String>();
        data = new ArrayList<List<Object>>();
    }
    public void addColumn(String colnam) {
        colnams.add(colnam);
    }
    public void addRow(List<Object> row) {
        data.add(row);
    }
    @Override
    public int getColumnCount() {
        return colnams.size();
    }
    @Override
    public int getRowCount() {
        return data.size();
    }
    public String getColumnName(int colix) {
        return colnams.get(colix);
    }
    @Override
    public Object getValueAt(int rowix, int colix) {
        return data.get(rowix).get(colix);
    }
}
Avatar billede arne_v Ekspert
12. september 2012 - 21:55 #5
Eksemplet er lavet til at vaere generelt.

Det kan laves lidt simplere.
Avatar billede DonSkoD Juniormester
13. september 2012 - 10:15 #6
Tak for de hurtige svar ;) de hjalp mig i den rigtige retning :)
Smid svar for points.

Jeg benyttede løsningen på siden: http://stackoverflow.com/questions/10620448/most-simple-code-to-populate-jtable-from-resultset
Avatar billede arne_v Ekspert
13. september 2012 - 15:06 #7
Den er faktisk ret taet paa min loesning.

Og svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester