JTable ja tietokanta

pulma

Miten saan seuraavassa esimerkissä näkymään henkilöiden tiedot JTable-komponentissa? Yhteys kantaan toimii mutta tiedot eivät tule näkyviin. Tämän olen todennut käyttämällä silmukassa välitulostusta. Tiedot saan näkyville, mikäli laitan henkilöiden tiedot suoraan koodiin mutta kun tarkoitus olisi hakea ne tietokannasta.

package henkilot;

import java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.*;
import java.util.*;


public class Frame1
extends JFrame
{
String sNimi;
String eNimi;
String ika;
static Statement stmt=null;
Vector data = new Vector();
Vector otsikot = new Vector(3);

JPanel contentPane;
XYLayout xYLayout1 = new XYLayout();
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
JButton jButton1 = new JButton();

public Frame1()
{
try
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}

/**
* Component initialization.
*
* @throws java.lang.Exception
*/
private void jbInit() throws Exception
{
contentPane = (JPanel) getContentPane();
contentPane.setLayout(xYLayout1);
setSize(new Dimension(400, 300));
setTitle("Frame Title");
jButton1.setText("jButton1");
jButton1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton1_actionPerformed(e);
}
});
contentPane.add(jScrollPane1, new XYConstraints(32, 36, 332, 141));
contentPane.add(jButton1, new XYConstraints(57, 208, 93, 39));
jScrollPane1.getViewport().add(jTable1);

otsikot.addElement("Sukunimi");
otsikot.addElement("Etunimi");
otsikot.addElement("Ikä");

connect();

}

private void connect()
{
try
{
Connection conn;
String url = "jdbc:sqlserver://localhost;databaseName=tkanta;user=root";

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
conn = DriverManager.getConnection(url);
conn.setAutoCommit(false);
}
catch(Exception e)
{

}
}

public void jButton1_actionPerformed(ActionEvent e)
{
try
{
String sql;
sql = "Select * from henkilot";
ResultSet rs = stmt.executeQuery(sql);

while(rs.next())
{
sNimi = rs.getString("sukunimi");
eNimi = rs.getString("etunimi");
ika = rs.getString("ika");

data.addElement(sNimi);
data.addElement(eNimi);
data.addElement(ika);

jTable1 = new JTable(data, otsikot);
}

}
catch (Exception ex)
{

}
}
}

1

508

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Kattotaan

      Aika paljon ihan perus virheitä.


      1. Ohitat ajonaikaiset virheet ilman tulostusta, joten et näe koodissasi olevia virheitä. Käsittele virheet vaikka seuraavasti:

      --- ALKAA ---

      } catch(Exception ex) {
         ex.printStackTrace();
         System.exit(1);
      }

      --- LOPPUU ---


      2. Kun luot JTabelen käyttäen nimi ja data vektoria, niin data vektori on tyyppiä Vector eikä Vector. Joten data vektorin luonti tietokannan perusteella tapahtuu seuraavasti:

      --- ALKAA ---

      data = new Vector();

      while(rs.next())
      {
         data_row = new Vector();

         data_row.addElement(rs.getString("sukunimi"));
         data_row.addElement(rs.getString("etunimi"));
         data_row.addElement(rs.getString("ika"));

         data.add(data_row);
      }

      --- LOPPUU ---


      3. Luot jostain syystä aina uuden taulukon (eli JTablen) kun haet tietokannasta uuden rivin, ja sen lisäksi et kuitenkaan vie kyseistä taulukkoa edes näytölle. Uutta taulukkoa (eli JTablea) ei kannata luoda (tai silloin pitää myös poistaa vanha syömästä resursseja) vaan kannattaa päivittää vanhan taulukon sisältö jotenkin.


      4. Ohjelmassasi on stmt muuttuja jota ei alusteta mistään.


      Alla yksinkertainen esimerkki ohjelma taulukosta jonka sisältö muuttuu/päivittyy/latautuu aina kun painetaan päivitys nappia. Voi tehdä kai helpomminkin, mutta etköhän sen perusteella pysty tekemään ohjelmastasi toimivan.

      --- ESIMERKKI ALKAA ---

      import java.awt.BorderLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.util.Random;
      import java.util.Vector;

      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JScrollPane;
      import javax.swing.JTable;
      import javax.swing.table.AbstractTableModel;

      public class Esimerkki extends JFrame implements ActionListener {

         private static final long serialVersionUID = -2813992171295808194L;

         private OmaTaulukkoMalli   omaTaulukkoMalli;
         private JTable            omaJTaulukko;
         private JButton            omaPainike;
         private Random            omaSatunnainen;


         public Esimerkki() {
            super("Esimerkki 1.0");

            omaTaulukkoMalli   = new OmaTaulukkoMalli(new String[] { "Etunimi", "Sukunimi", "Ikä" });
            omaJTaulukko      = new JTable(omaTaulukkoMalli);
            omaPainike         = new JButton("Päivitä");
            omaSatunnainen      = new Random();
            
            omaPainike.addActionListener(this);
            
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(new JScrollPane(omaJTaulukko), BorderLayout.CENTER);
            getContentPane().add(omaPainike, BorderLayout.SOUTH);
         }


         public static void main(String[] args) {
            Esimerkki esimerkki = new Esimerkki();
            
            esimerkki.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            esimerkki.setSize(500,500);
            esimerkki.setVisible(true);
         }

         
         public void actionPerformed(ActionEvent e) {
            Vector dataRivit = new Vector();

            
            for (int i = 0; i < 1 omaSatunnainen.nextInt(80); i ) {
               Vector rivi = new Vector();
               
               rivi.addElement("1: " omaSatunnainen.nextInt(20));
               rivi.addElement("2: " omaSatunnainen.nextInt(20));
               rivi.addElement("3: " omaSatunnainen.nextInt(20));
               
               dataRivit.add(rivi);
            }
            
            omaTaulukkoMalli.päivitäData(dataRivit);      
         }
         
         
         class OmaTaulukkoMalli extends AbstractTableModel {
            
            private static final long serialVersionUID = 4531209187715544316L;
            
            private String[]            sarakkeidenNimet;
            private Vector   dataRivit;
            
            public OmaTaulukkoMalli(String[] sarakkeidenNimet)
            {
               this.dataRivit         = new Vector();
               this.sarakkeidenNimet   = sarakkeidenNimet;
            }

            public int getColumnCount() {
               return sarakkeidenNimet.length;
            }
            
            public int getRowCount() {
               return dataRivit.size();
            }

            public String getColumnName(int col) {
               return sarakkeidenNimet[col];
            }

            public Object getValueAt(int row, int col) {
               return dataRivit.get(row).get(col);
            }
            
            public void päivitäData(Vector dataRivit) {
               this.dataRivit = dataRivit;
               fireTableDataChanged();
            }
         }
      }

      --- ESIMERKKI LOPPUU ---

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Takaisin ylös

    Luetuimmat keskustelut

    1. Porvarimediat paniikissa demareiden huiman kannatuksen vuoksi

      Piti sitten keksiä "nimettömiin lähteisiin" perustuen taas joku satu. Ovat kyllä noloja, ja unohtivat sen, että vaalit
      Maailman menoa
      175
      8517
    2. KATASTROFI - Tytti Tuppurainen itse yksi pahimmista kiusaajista!!!

      STT:n lähteiden mukaan SDP:n eduskuntaryhmän puheenjohtaja Tytti Tuppurainen on käyttäytynyt toistuvasti epäasiallisesti
      Maailman menoa
      455
      7727
    3. Mikä siinä on ettei persuille leikkaukset käy?

      On esitetty leikkauksia mm. haitallisiin maataloustukiin, kuin myös muihin yritystukiin. Säästöjä saataisiin lisäksi lei
      Maailman menoa
      76
      3900
    4. Lääppijä Lindtman jäi kiinni itse teosta

      Lindtman kyselemättä ja epäasiallisesti koskettelee viestintäpäällikköä. https://www.is.fi/politiikka/art-2000011780852
      Maailman menoa
      163
      3786
    5. Juuri nyt! Tytti Tuppurainen on käyttäytynyt toistuvasti epäasiallisesti

      Ai että mä nautin, Tytti erot vireille! "Käytös on kohdistunut avustajia ja toisia kansanedustajia kohtaan, uutisoi STT
      Maailman menoa
      122
      3105
    6. Huomaatteko Demari Tytti ei esitä pahoitteluitaan

      Samanlainen ilmeisesti kuin Marin eli Uhriutuu no he ovat Demareita ja muiden yläpuolella siis omasta mielestään
      Maailman menoa
      70
      2967
    7. Turvaan tulleet lähettävät omia lapsiaan vaaraan - hullua

      MOT-ohjelman jakso ”Loma vaihtui kahleisiin” kertoi, kuinka Suomessa ja muualla Euroopassa asuvat somaliperheet lähettäv
      Maailman menoa
      44
      2091
    8. Onko kaivattusi

      liian vetovoimainen seksuaalisesti?
      Ikävä
      126
      2086
    9. Puolen vuoden koeaika

      Voisi toimia meillä. Ensin pitäis selvittää "vaatimukset" puolin ja toisin, ennen kuin mitään aloittaa. Ja matalalla pro
      Ikävä
      23
      1913
    10. Vedonlyöntiä .

      Olen valmis lyömään ison vedon , että homma kaatuu . Jos kerta Sivonen ei lähde mukaan , niin ei tuoho usko kukaan muuka
      Ähtäri
      21
      1891
    Aihe