24. november 2008 - 22:30
Der er
17 kommentarer og 1 løsning
Løkke i JTable, hvorfor virker det ikke?
Hvordan kan det være at jeg ikke kan putte en forløkke ind i nedenstående kode? jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { for (int i=0; i<0; i++) { {i, i}, } }, new String [] { "Title 1", "Title 2" } )); Hvordan ser en mulig løsingi så fald ud? På forhånd tak.
Annonceindlæg fra DE-CIX
24. november 2008 - 22:50
#1
proev noget a la: Object[][] tmp = new Object[2][3]; for(int i = 0; i < 3; i++) { tmp[0][i] = i; tmp[1][i] = "Title " + i; } jTable1.setModel(new DefaultTableModel(tmp));
24. november 2008 - 22:55
#2
Hmm... Den sætter rød streg under DefaultTableModel og siger: "Cannot find symbol"
24. november 2008 - 23:02
#3
put lige en import af javax.swing.table.DefaultTableModel oppe i toppen - jeg slettede package navnet i kaldet
24. november 2008 - 23:08
#4
Det skulle være tilføjet. Det ser ud til, at den vil have Kolonnenavnene på. Det virker hvis jeg eksempelvis siger: (...) String [] a = { "Title 1", "Title 2"} ; jTable1.setModel(new DefaultTableModel(tmp, a));
24. november 2008 - 23:15
#5
Men hvis jeg skal bruge Object[][] tmp = new Object[2][3]; Skal jeg jo vide hvor mange felter der skal tilføjes. Hvad nu hvis jeg ikke ved det? Kan man ikke gøre på en måde som i en ArrayList hvor man kan tilføje værdier uden at skulle tænke på om der er plads?
25. november 2008 - 19:45
#6
Det er ikke nødvendigvis vanskeligt, her er 3 forskellige måder at gøre det på, du kan også lave din egen TableModel, hvilket selvfølgelig giver fuld kontrol, men jeg fornemmer ikke det er nødvendigt i din situation. import java.util.Vector; import javax.swing.JOptionPane; import javax.swing.table.DefaultTableModel; public class TableTest extends javax.swing.JFrame { public TableTest() { initComponents(); model = (DefaultTableModel)table.getModel(); } private void initComponents() { jPanel1 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setText("Add column"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addColumn(evt); } }); jPanel1.add(jButton1); jButton2.setText("Add row"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addRow(evt); } }); jPanel1.add(jButton2); jButton3.setText("Alternativ"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { alternativ(evt); } }); jPanel1.add(jButton3); getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH); jPanel2.setLayout(new java.awt.BorderLayout()); table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { } )); jScrollPane1.setViewportView(table); jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER); getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER); pack(); } private void addColumn(java.awt.event.ActionEvent evt) { model.addColumn("Column " + table.getColumnCount()); } private void addRow(java.awt.event.ActionEvent evt) { model.addRow(new Vector()); } private void alternativ(java.awt.event.ActionEvent evt) { String s = JOptionPane.showInputDialog("Skriv antal rækker,kolonner [HUSK komma]", "10,5"); String[] ss = s.split(","); if(ss.length == 2){ int r = Integer.parseInt(ss[0].toString()); int c = Integer.parseInt(ss[1].toString()); Object[] columns = new Object[c]; for (int i = 0; i < columns.length; i++) { columns[i] = "Column " + i; } model.setDataVector(new Object[r][c], columns); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new TableTest().setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable table; private DefaultTableModel model; }
26. november 2008 - 18:08
#7
Det ser meget fint ud, carsten. Men hvordan kan jeg så tilføje værdier i felterne?
26. november 2008 - 18:23
#8
Dette kunne være én måde at gøre det på private void alternativ(java.awt.event.ActionEvent evt) { String s = JOptionPane.showInputDialog("Skriv antal rækker,kolonner [HUSK komma]", "10,5"); String[] ss = s.split(","); if(ss.length == 2){ int r = Integer.parseInt(ss[0].toString()); int c = Integer.parseInt(ss[1].toString()); Object[] columns = new Object[c]; for (int i = 0; i < columns.length; i++) { columns[i] = "Column " + i; } Object o = new Object[r][c]; // INDSÆTTE VÆRDIER for (int i = 0; i < r; i++) { for (int x = 0; x < c; x++) { o[i][x] = "Row " + i + ", column " + x; } } model.setDataVector(o, columns); } }
26. november 2008 - 18:43
#9
Men det løser jo ikke mit problem. Det var jo meningen at jeg skulle kunne tilføje rows uden at vide hvor mange der skal være plads til. Jeg har en tabel i en database som jeg ønsker at blive vist i en jTable. Man kunne jo tælle antal recordset i tabellen, men det er jo det med at finde den nemmeste løsning.
26. november 2008 - 19:05
#10
Alle 3 metoder løser problemet Den illustrative metode private void addRow(java.awt.event.ActionEvent evt) { model.addRow(new Vector()); } Den lidt mere illustrative metode private void addRow(java.awt.event.ActionEvent evt) { Vector v = new Vector(); // HENT DATA FRA DB, PUT HVER RÆKKE FRA DB I VECTOREN v.add("Kolonne 1 fra db"); v.add("Kolonne 2 fra db"); v.add("Kolonne 3 fra db"); v.add("Kolonne 4 fra db"); // ADD VECTOR TIL GUI == Ny række i gui tabel model.addRow(v); }
26. november 2008 - 19:11
#11
Hvordan henter du data fra db ?
26. november 2008 - 19:16
#12
Sådan her: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\\Database\\MSAccess\\Test.mdb;Uid=Admin;Pwd=;"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM T1"); while(rs.next()) { System.out.println(rs.getInt(1) + " " + rs.getString(2)); }
26. november 2008 - 19:28
#13
Fint - nu ved jeg ikke om det sker i samme klasse/metode, men det må du selv korrigere for Eksempel: model = // den parameter skal være tilgængelig her !!!!!!!!!!!!!!! Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\\Database\\MSAccess\\Test.mdb;Uid=Admin;Pwd=;"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM T1"); while(rs.next()) { Vector v = new Vector(); v.add( new Integer(rs.getInt(1)); v.add(rs.getString(2)); model.add(v); System.out.println(rs.getInt(1) + " " + rs.getString(2)); }
26. november 2008 - 19:30
#14
HUSK at adde 2 kolonner, den glemte jeg lige i farten :) model.addColumn("Kolonnenavn 1"); model.addColumn("Kolonnenavn 2");
26. november 2008 - 20:14
#15
model = (DefaultTableModel)jTable1.getModel(); model.addColumn("Kolonnenavn 1"); model.addColumn("Kolonnenavn 2"); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\Users\\Peter\\Desktop\\Poker.mdb;Uid=;Pwd=;"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Hands ORDER BY Finished"); while(rs.next()) { Vector v = new Vector(); v.add(new Integer(rs.getInt(1))); v.add(rs.getString(2)); model.add(v); } } catch (Exception e) { // Nothing } Den sætter rød streg under add i "model.add(v);" Hvad gør jeg forkert?
26. november 2008 - 20:16
#16
... addRow :) Så virker det
26. november 2008 - 20:26
#17
Det er nok mest retfærdigt at tilskrive dig point carsten, så post du et svar.
26. november 2008 - 20:48
#18
addRow - selvfølgelig :)
Kurser inden for grundlæggende programmering