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)
{
}
}
}
JTable ja tietokanta
1
496
Vastaukset
- 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ä.
Luetuimmat keskustelut
Jens Ihlen (ex Kukka) poika todistaa oikeudessa
10:49 "Välit ovat olemattomat" Minkälainen isäsi ja sinun välinen suhde on tällä hetkellä? "Minulla ei ole minkäännäkö28010316K-kaupassa on mukava käydä, kun ei tarvitse katsella köyhiä
vasemmistolaisia, joista monet myös varastavat. Mielellään maksaa vähän enemmän tuotteista K-kaupassa, jotka ovat paljon2456006Suomeen ei kuulu ihmiset jotka ei halua kätellä toisia ihmisiä, koska tämä on vääräuskoinen
Nainen joka ei halunnut kätellä Stubbia on selvästi ääripään muslimi, eli sitä sakkia josta niitä ongelmia koituu. Ulos1735434PS:n Purra teki -JÄTTI-VELAT
* * PS:n Purra teki -JÄTTI-VELAT - ! ja jätti MaksuHuolet -Kansan Maksettavaksi -! *955048Vain vasemmistolaiset rakennemuutokset pelastavat Suomen
Kansaa on ankeutettu viimeiset 30+ vuotta porvarillisella minäminä-talouspolitiikalla, jossa tavalliselta kansalta on ot193325Persut huutaa taas: "kato! muslimi!"
Persut on lyhyessä ajassa ajaneet läpi kaksi työntekijöiden oikeuksien heikennystä, joita se on aiemmin vastustanut. Pe92714- 2142622
Nainen, sanotaan että totuus tekee kipeää
Ehkä mutta se voi olla myös se kaikkein kamalin asia kohdata. Kuplassa on turvallista, kun tietää vähemmän on helpompi.172444- 282294
Valtio lopettaa pienituloisten perheiden kylpylälomien tukemisen
Pienituloiset suomalaiset ovat voineet vuosikymmenten ajan hakea tuettuja lomia terveydellisin, sosiaalisin ja taloudell3822217