2016-07-10 16 views
1

Ich habe Daten aus der Datenbank auf meinem JTable. Ich möchte jeder Zeile dynamisch aus der Datenbank Checkboxen hinzufügen. Ich werde später diese Kontrollkästchen verwenden, um Zeilen zu löschen, die von der Datenbank überprüft wurden. Ich weiß, wie man aus der Datenbank löscht, aber wie man Checkboxen von der Datenbank hinzufügt? Irgendjemand, der das vorher getan hat, bitte helfen Sie. Ich bin ein Java-Enthusiast, der versucht, es zu lernen. Ein Beispielcode könnte mir helfen, das zu verstehen.Wie JCheckBox dynamisch zu jeder Zeile hinzugefügt von MySQL-Datenbank zu JTable

-Code unten ist für meine JTable Aktualisierung:

public void UpdateTable() { 

    try { 

     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" 
       + "employee_certificate", "root", ""); 

     String sql = "SELECT certificate.Number, staff.Emp_Id, staff.Emp_Name, " 
       + "staff.Department, certificate.Cert_Code, certificate.Cert_Name,\n" 
       + "certificate.Vendor, certificate.Date_Taken, " 
       + "certificate.Expiry_Date FROM staff LEFT JOIN certificate" 
       + " ON staff.Emp_Id=certificate.Emp_Id ORDER BY staff.Emp_Name\n"; 

     PreparedStatement pstmt = con.prepareStatement(sql); 
     ResultSet rs = pstmt.executeQuery(); 
     jTable1.setModel(DbUtils.resultSetToTableModel(rs)); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 
+1

Warum nicht den Tisch decken, so dass mehrere Zeilen ausgewählt werden können, und verfügen über einen separaten (außerhalb der Tabelle), um 'Ausgewählte Zeilen löschen '? –

+1

Ich möchte nicht, dass der Benutzer es schwer hat, sich an etwas wie ctrl + a oder ctrl + c zu erinnern. Ich möchte nur, dass sie Checkboxen verwenden, die benutzerfreundlicher sind. –

+0

stimme ich überhaupt nicht zu. Aber hey, viel Glück damit. –

Antwort

2

von diesen kompletten example Ab ich die Änderungen unten gab folgendes Ergebnis zu erhalten. Insbesondere wird

  • ein Attribut Boolean checked gegeben, ersetzt String name.

  • Der Standardwert renderer verwendet ein Kontrollkästchen, wenn getColumnClass()Boolean.class für Row.checked zurückgibt. In der entsprechenden JDBC und SQL ist das checked Attribut vom Typ boolean.

image

$ diff Original.java WorkerTest.java 
48c48 
<   String name; 
--- 
>   Boolean checked; 
91c91 
<      return row.name; 
--- 
>      return row.checked; 
105a106,116 
>   @Override 
>   public Class<?> getColumnClass(int colIndex) { 
>    switch (colIndex) { 
>     case 0: 
>      return Integer.class; 
>     case 1: 
>      return Boolean.class; 
>    } 
>    return null; 
>   } 
> 
114c125 
<       r.name = rs.getString(2); 
--- 
>       r.checked = rs.getBoolean(2); 
138c149 
<    st.execute("create table city(id integer, name varchar2)"); 
--- 
>    st.execute("create table city(id integer, checked boolean)"); 
143,144c154 
<     ps.setString(2, (char) ('A' + r.nextInt(26)) 
<      + String.valueOf(r.nextInt(1_000_000))); 
--- 
>     ps.setBoolean(2, Boolean.valueOf(r.nextBoolean())); 
1

Das Problem ist DBUtils liefert ein komplettes TableModel.

Am einfachsten ist es, DBUtils NICHT zu verwenden und die Daten von ResultSet selbst in die TableModel zu laden.

Der Code ist nicht schwierig und Sie können die Table From Database Example gefunden in Table From Database als Ausgangspunkt verwenden.

Der Code lädt nur die Daten aus dem ResultSet in Vektoren. Sie können dann manuell eine weitere Spalte hinzufügen, um boolesche Daten zu enthalten.

Die (zwei) Änderungen an dem Code würde wie etwas sein:

// Get column names 

for (int i = 1; i <= columns; i++) 
{ 
    columnNames.addElement(md.getColumnName(i)); 
} 

columnName.addElement("Check Mark"); // added 

// Get row data 

while (rs.next()) 
{ 
    Vector<Object> row = new Vector<Object>(columns); 

    for (int i = 1; i <= columns; i++) 
    { 
     row.addElement(rs.getObject(i)); 
    } 

    row.addElement(Boolean.FALSE); // added 
    data.addElement(row); 
}