Volledige versie bekijken : [Java Swing] Data in een JTable laden/ zoeken op voorkeuren



Subhero
13 May 2010, 15:16
Ik zit weer vast helaas. Sorry dat ik jullie hier bombardeer met al die vragen maar mijn project moet zondag af zijn en ik wil toch tenminste de helft van de punten halen :shy:

Nu moet ik al de data die ik heb uit de tabellen kunnen opzoeken en inladen in een JTable. Ik heb nu dus de comboboxen met bv. de gemeenten. Als ik daar een gemeente uit kies en op zoek druk, moet hij alle stagestudenten die in de bedrijven in die gemeente op stage staan, tonen in de JTable.

Ik heb gewoon geen flauw idee hoe ik daaraan begin. Doe ik dit met queries in de Data Acces klasse of laad ik eerste alles in de JTables en daarna deze de zoekacties laten behandelen? Als ik alleen al de preferentie van gemeenten kan vinden zou ik al blij zijn, en kan ik daar verder op borduren.


public class StudentFrame extends JFrame implements ActionListener {

private Container content;
private JPanel topLeft, topRight, bottomLeft, bottomRight;
private JComboBox gemeentenBox, sectorBox, soortBox;
private JTextField aantalVeld;
private JButton zoekenButton;
private String gemeente;

private DAjstageLogin daLogin = null;
private DAjstageBedrijf daBedrijf = null;
private DAjstageGemeente daGemeente = null;
private DAjstageKeuze daKeuze = null;
private DAjstageSector daSector = null;
private DAjstageSoort daSoort = null;
private DAjstageStudent daStudent = null;
private DAjstageOpdracht daOpdracht = null;

public StudentFrame(DAjstageBedrijf daBedrijf, DAjstageKeuze daKeuze, DAjstageGemeente daGemeente, DAjstageSector daSector, DAjstageOpdracht daOpdracht, DAjstageSoort daSoort, DAjstageStudent daStudent, DAjstageLogin daLogin)
throws Exception {

this.daGemeente = daGemeente;
this.daSector = daSector;
this.daOpdracht = daOpdracht;
this.daStudent = daStudent;
this.daKeuze = daKeuze;
this.daLogin = daLogin;
this.daSoort = daSoort;

this.setLocation(150,150);
setTitle("Welkom");
setSize(1000,750);
opbouwScherm();
addWindowListener(new VensterHandler());
setVisible(true);
this.setResizable(false);

}


public void opbouwScherm(){
content = getContentPane();
content.setLayout(null);

JComboBox gemeentenBox = new JComboBox(daGemeente.getjStageGemeente());
gemeentenBox.insertItemAt("geen voorkeur", 0);
JComboBox sectorBox = new JComboBox(daSector.getjStageSector());
sectorBox.insertItemAt("geen voorkeur", 0);
JComboBox soortBox = new JComboBox(daSoort.getjStageSoort());
soortBox.insertItemAt("geen voorkeur", 0);

JTextField aantalVeld = new JTextField();

JButton zoekenButton = new JButton("Zoek");
zoekenButton.addActionListener(this);

JLabel gemeentenLabel = new JLabel("Locatie bedrijf:");
JLabel aantalLabel = new JLabel("Werkzame informatici:");
JLabel sectorLabel = new JLabel("Sector stagebedrijf:");
JLabel soortLabel = new JLabel("Soort stage:");

//comboboxen
gemeentenBox.setBounds(5, 30, 150, 20);
sectorBox.setBounds(160, 30, 325, 20);
soortBox.setBounds(495, 30, 140, 20);
aantalVeld.setBounds(625, 30, 135, 20);

//labels
gemeentenLabel.setBounds(5,10,120,20);
sectorLabel.setBounds(160,10,120,20);
soortLabel.setBounds(495,10,120,20);
aantalLabel.setBounds(625,10,135,20);

//buttons
zoekenButton.setBounds(800,30,80,20);

content.add(gemeentenBox);
content.add(sectorBox);
content.add(soortBox);
content.add(aantalVeld);
content.add(gemeentenLabel);
content.add(sectorLabel);
content.add(soortLabel);
content.add(aantalLabel);
content.add(zoekenButton);

}

public void actionPerformed(ActionEvent e) {

gemeente = gemeentenBox.getSelectedItem()+"";

System.out.println(daGemeente.getGemeenten(gemeent e));

}

class VensterHandler extends WindowAdapter {
public void windowClosing(WindowEvent e) {
try {
System.exit(0);
} catch (Exception err) {
JOptionPane.showMessageDialog(content, "Fout bij sluiten databank","Error", JOptionPane.ERROR_MESSAGE);
}
}
}

}


public class DAjstageGemeente {
private Connection connection = null;

public DAjstageGemeente (String url, String login, String password, String driver)
throws ClassNotFoundException, SQLException
{
Class.forName(driver);
connection = DriverManager.getConnection(url, login, password);
}
public void close() throws SQLException {
if(connection != null) {
connection.close();
}
}

public Vector<jstageGemeente> getjStageGemeente() {

Statement stmt = null;
ResultSet rs = null;
jstageGemeente gemeente = null;
Vector <jstageGemeente> resultaat = new Vector<jstageGemeente>();

try {
stmt = connection.createStatement();
rs = stmt.executeQuery("SELECT DISTINCT (gemeente), id, postcode FROM jstageGemeente GROUP BY gemeente");

while (rs.next()) {
gemeente = new jstageGemeente();
gemeente.setId(rs.getInt(2));
gemeente.setPostcode(rs.getInt(3));
gemeente.setGemeente(rs.getString(1));
resultaat.add(gemeente);
}
}
catch(Exception e) {
e.printStackTrace();
}
finally
{ try {
if(stmt!=null) stmt.close();
if(rs!=null) rs.close();
} catch(SQLException e){}
}
return resultaat;
}



Hieronder heb ik iets geprobeerd. Namelijk om de vector te vullen met String objecten. Helaas werkt dit niet goed, zoals verwacht natuurlijk. Ik kom te verwachten dat mijn code niet werkt ondertussen. Ik heb geprobeerd om de keuze in Netbeans af te drukken




public Vector getGemeenten(String gemeenten) {
Vector result = new Vector();
PreparedStatement stmt = null;
ResultSet rs = null;

try{
stmt = connection.prepareStatement("SELECT gemeente FROM jstageGemeente WHERE gemeente = ?");
stmt.setString(1, gemeente);
rs = stmt.executeQuery ();

while (rs.next()) {
Vector rijVector = new Vector();
rijVector.add(rs.getString(1));
result.add(rijVector);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (stmt != null) stmt.close();
if (rs != null) rs.close();
} catch(SQLException e){}
}
return result;
}

}

Alvats bedankt

ultddave
13 May 2010, 15:53
SELECT gemeente FROM jstageGemeente WHERE gemeente = ?
Je moet goed begrijpen wat die SELECT doet. ;)

SELECT gemeente wilt zeggen dat je enkel de kolom gemeente gaat opvragen uit jstageGemeente.

Als ik daar een gemeente uit kies en op zoek druk, moet hij alle stagestudenten die in de bedrijven in die gemeente op stage staan, tonen in de JTable.

In de veronderstelling dat de tabel "jstagegemeente" de naam van de studenten bevat en de gemeente waar ze werken. Zou je dit moeten doen:

SELECT naam, gemeente FROM jstageGemeente WHERE gemeente = ?
Als je de naam en de gemeente wilt opvragen. Als je enkel de naam wilt hebben, moet je:

SELECT naam FROM jstageGemeente WHERE gemeente = ?
gebruiken.

PS:

public Vector getGemeenten(String gemeenten) {
Vector result = new Vector();
PreparedStatement stmt = null;
ResultSet rs = null;

try{
stmt = connection.prepareStatement("SELECT gemeente FROM jstageGemeente WHERE gemeente = ?");
stmt.setString(1, gemeente);
rs = stmt.executeQuery ();

while (rs.next()) {
Vector rijVector = new Vector();
rijVector.add(rs.getString(1));
result.add(rijVector);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (stmt != null) stmt.close();
if (rs != null) rs.close();
} catch(SQLException e){}
}
return result;
}

Je maakt zelf nog een vector aan, terwijl er al 1 bestaat.

En ik denk dat deze ook fout is: stmt.setString(1, gemeente);
De parameter is gemeenten (meervoud). De variabele gemeente zal niet bestaan normaal gezien. (Tenzij ik iets over het hoofd heb gezien).

In de functie die getGemeente aanroept, moet je die vector opvangen en doorlopen. (For lus bijvoorbeeld).

Maar ik ken bijna niet zoveel van Netbeans en die tables etc in Java.

Pseudocode:Vector resultaat = getGemeenten("Brussel");
for(int i = 0; i <resultaat.size(); ++i)
Tabel.addItem(resultaat[i]);

Ik ken de juiste Java syntax niet daarvoor. ;)

Mvg,
Dave

carl
13 May 2010, 15:55
Ik weet niet wat dave aan het typen is, maar ik kan even kort samenvatten wat je moet doen :)

Als je met een JTable werkt is het waarschijnlijk de bedoeling dat je je gegevens kan aanpassen ? Dan moet je met MVC (model view controller) werken.

Je moet dan een tablemodel schrijven dat een lijst van student objecten op een correcte manier kan weergeven (defaulttablemodel implementeren en methodes overschrijven). En eventueel gebruik maken van het observer pattern om de gegevens in sync te houden (database - objecten).

Het inlezen van alle data uit je database en dan pas filteren is ENORM slecht. Je sql host kan ide gegevens 10 keer sneller filteren dan java, waarin je zal moeten een sequentiele zoekactie uitvoeren en een heleboel objecten instantieren. (met kans op een stack overflow als je database echt groot is).

Om preciezer te zijn zou een model van je database (relationeel model of een sql dump) handig zijn.

PS: Ik ken het probleem wel maar in het vervolg niet zo lang wachten ! ;)

ultddave
13 May 2010, 15:59
Het inlezen van alle data uit je database en dan pas filteren is ENORM slecht.
Inderdaad :D.

En het bespaart je zoiezo heel wat werk om de database alles te laten doen. Een vector is trouwens ook niet echt geschikt voor te filteren wegens de lange tijd die nodig is om een element in het midden/vooraan van de vector te verwijderen. ;)
Dat vergt tijdscomplexiteit O( n ) als ik me niet vergis. Het laatste element verwijderen is O(1).


mijn project moet zondag af zijn en ik wil toch tenminste de helft van de punten halen
Tss :P. Op tijd beginnen eh :D.

Mvg,
Dave