Avatar billede flodhesten Nybegynder
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.
Avatar billede arne_v Ekspert
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));
Avatar billede flodhesten Nybegynder
24. november 2008 - 22:55 #2
Hmm... Den sætter rød streg under DefaultTableModel og siger: "Cannot find symbol"
Avatar billede arne_v Ekspert
24. november 2008 - 23:02 #3
put lige en import af javax.swing.table.DefaultTableModel oppe i toppen - jeg slettede
package navnet i kaldet
Avatar billede flodhesten Nybegynder
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));
Avatar billede flodhesten Nybegynder
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?
Avatar billede _carsten Nybegynder
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;
}
Avatar billede flodhesten Nybegynder
26. november 2008 - 18:08 #7
Det ser meget fint ud, carsten. Men hvordan kan jeg så tilføje værdier i felterne?
Avatar billede _carsten Nybegynder
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);
        }
    }
Avatar billede flodhesten Nybegynder
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.
Avatar billede _carsten Nybegynder
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);
    }
Avatar billede _carsten Nybegynder
26. november 2008 - 19:11 #11
Hvordan henter du data fra db ?
Avatar billede flodhesten Nybegynder
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));
      }
Avatar billede _carsten Nybegynder
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));
      }
Avatar billede _carsten Nybegynder
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");
Avatar billede flodhesten Nybegynder
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?
Avatar billede flodhesten Nybegynder
26. november 2008 - 20:16 #16
... addRow :)


Så virker det
Avatar billede flodhesten Nybegynder
26. november 2008 - 20:26 #17
Det er nok mest retfærdigt at tilskrive dig point carsten, så post du et svar.
Avatar billede _carsten Nybegynder
26. november 2008 - 20:48 #18
addRow - selvfølgelig :)
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