Jag kunde ha förklarat lite mera i förra svaret. De flesta Swing-komponenterna (JList, JTable, JComboBox...) är uppbyggda enligt ett designmönster kallat Model-View-Controller, MVC. Kort sagt är Model den del som hanterar datat, View presenterar datat och Controller koordinerar det hela. Här Lite koda: Först: på vilket vis fungerar det inte? Får du något felmeddelande?jTable?
Hej
Jag vill presentera data från databasen i jTable som jag skapat i NetBeans ID 6. med hjälp av knappklickning. så här långt har jag kommet:
private void HamtaPersoner() {
try {
Object[][] data;
Class.forName("com.mysql.jdbc.Driver");
String connectionUrl = "jdbc:mysql://localhost/Personer?" +
"user=XXXX&password=XXXXXXXX";
Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = null;
ResultSet rs = null;
String SQL = "SELECT perID,namn FROM person order by perID";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
while (rs.next()) {
int perID = rs.getInt(1);
String namn = rs.getString(2);
data = new Object[perID][2] ; // det är 2 kolumnar i jTable1
skriv ut data i jTable1 ...........?
}
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
} catch (ClassNotFoundException cE) {
System.out.println("Class Not Found Exception: "+ cE.toString());
}
}
Sv: jTable?
I ditt fall med JTable är View:n det som visas på skärmen, med tabellhuvud, rader osv. Controllern är eventuella lyssnare du lagt till till tabellen.
Den kvarstående delen, modellen, är det du vill åstadkomma. Det enklaste sättet är att skapa den typ:
Vector cols = new Vector();
cols.add("id");
cols.add("namn");
Vector rows = new Vector();
// Din SQL-kod här
Vector v;
while (rs.next()) {
v = new Vector();
v.add(rs.getInt(1));
v.add(rs.getString(2));
rows.add(v);
}
JTable table = new JTable(rows, cols);
Då skapas automatiskt en DefaultTableModel, och din JTable byggs runt denna. Du hämtar alltså personerna från databasen, lägger dem i en Vector med Vectors och skickar dem till konstruktorn.
Ett annat sätt är att skriva en klass som antingen ärver av DefaultTableModel eller implementerar interfacet TableModel.
Suns tutorial om JTable tar upp båda sätten: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
Sv:jTable?
Hej!
Tack för svaret. Jag har försökt att lösa detta problem men lyckades inte. Jag vill ha din lösning med det. en hel klass...
Tack!
MVH
/AnderSv:jTable?
package person;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JTableExample1 extends javax.swing.JFrame {
public JTableExample1(JTable table) {
initComponents();
try {
table1 = new DefaultTableModel();
Class.forName("com.mysql.jdbc.Driver");
String connectionUrl = "jdbc:mysql://localhost/personer?" +
"user=root&password=password";
Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = null;
ResultSet rs = null;
Vector cols = new Vector();
cols.add("id");
cols.add("namn");
//SQL query command
String SQL = "SELECT * FROM person order by perID";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
Vector rows = new Vector();
Vector v;
while (rs.next()) {
v = new Vector();
v.add(rs.getInt(1));
v.add(rs.getString(2));
rows.add(v);
}
table = new JTable(rows, cols);
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
} catch (ClassNotFoundException cE) {
System.out.println("Class Not Found Exception: "+ cE.toString());
}
}
public static void main(String args[]) {
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}
Sv: jTable?
Några kommentarer:
1. Du skapar aldrig en instans av JTableExample1 i main-metoden.
2. Du lägger aldrig till den skapade JTable, komponenten till din JFrame.
3. Du sätter aldrig din JFrame synlig. Gör det med pack och setVisible metoderna.
4. Konstruktorn JTableExample1 tar en JTable som parameter. Varför?
5. Du sätter table1 till en ny DefaultTableModel. Det är onödigt. Dessutom är inte table1 deklarerad alls.
Annars ser det bra ut. Pröva göra ändringarna ovan och testa sedan.Sv:jTable?
Jag skickade en kod som var väldigt tunn, men efter jag har läst dina kommentarer, har jag löst problemmet så här:
package skivsamling;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.table.DefaultTableModel;
public class JTableExample1 extends javax.swing.JFrame {
private DefaultTableModel model;
public JTableExample1() {
initComponents();
model = new DefaultTableModel();
jTable1.setModel( model );
try {
String[] names = {"PersonID", "Namn"};
Vector colNames = new Vector();
colNames.addAll(Arrays.asList(names));
String connectionUrl = "jdbc:mysql://localhost/personer?" +
"user=root&password=password";
Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = null;
ResultSet rs = null;
Vector cols = new Vector();
cols.add("id");
cols.add("namn");
//SQL query command
String SQL = "SELECT * FROM person order by perID";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
Vector rows = new Vector();
Vector v;
while (rs.next()) {
v = new Vector();
v.add(rs.getInt(1));
v.add(rs.getString(2));
rows.add(v);
model.setDataVector(rows, colNames);
}
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
} catch (ClassNotFoundException cE) {
System.out.println("Class Not Found Exception: "+ cE.toString());
}
}
public static void main(String args[]) {
JTableExample1 visatabell = new JTableExample1();
visatabell.setVisible( true );
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}
Jag är ny i java, jag kör mest ASP.NET
Jag vill tacka dig mycket för hjälpen