[Java] gegeven in JList weer gebruiken in db query

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Hoi allen,

Ja, ik heb weer een vraag...

Ik heb in hsqldb de volgende tabel:

tabelnaam = people

id INTEGER IDENTITY
firstname VARCHAR(30)
lastname VARCHAR(30)


Nu haal ik met een query de gegevens op uit de tabel en laat deze in een JList zien. De voornaam en achternaam zitten hierbij in een string als het ware.

Ik vraag me nu af hoe ik heb beste (als ik gegevens wil wijzigen of verwijderen) de verschillende rows uitelkaar haal. Stel ik heb een naam "Piet de Tuinman", dit verschijnt in een string als volgt in de JList "de Tuinman, Piet". Vervolgens kun je dit niet meer gebruiken om de juiste row te bepalen omdat je voornaam en achternaam hebt samengevoegd. Ik zat ook te denken om met een reguliere expressie de naam voor en achter de komma te scheiden en zo deze alsnog te kunnen gebruiken in de query. Of bijv. een array bij te houden met de namen en de bijbehorende id's (daar zijn die dingen nou eenmaal voor).

Aangezien ik nog een java noob ben zie ik vast wel iets over het hoofd dat het makkelijker maakt.... :*)

Heeft iemand een suggestie?

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22-05 13:42
Met Non-Windows Operating Systems heeft dit in ieder geval heel weinig te maken, ik verplaats dit topic daarom naar Programming & Webscripting

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je moet geen strings aan die JList toevoegen, maar de objecten zelf. Dan kan je later gewoon het geselecteerde object gaan bewerken.

Het is verder ook handiger om met objecten te gaan werken ipv met losse velden. Ik dus een object Mens bv aanmaken en deze dus toevoegen aan die JList.

[ Voor 37% gewijzigd door Alarmnummer op 25-09-2004 15:00 ]


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Allereerst, sorry voor mijn fout. Natuurlijk hoort dit niet thuis in NOS...


Dus als ik het goed begrijp zou ik gewoon een object aan moeten maken met daarin id, voornaam en achternaam verwerkt?

  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 19:07
En om die objecten in de JList te krijgen, moet je even naar de ListModel interface kijken.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

knopper schreef op 25 september 2004 @ 15:10:
Allereerst, sorry voor mijn fout. Natuurlijk hoort dit niet thuis in NOS...


Dus als ik het goed begrijp zou ik gewoon een object aan moeten maken met daarin id, voornaam en achternaam verwerkt?
Yep.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Persoon{
    private String _voornaam;
    private long _id;

    public Persoon(long id, String voornaam){
        _id = id;
        _voornaam = voornaam;
    }

    public String getVoornaam(){
        return _voornaam;
    }
    
    public long getId(){
        return _id;
    }
    
    public String toString(){
        return "persoon met "+_voornaam+" en "_id;
    }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Boktor schreef op 25 september 2004 @ 15:13:
En om die objecten in de JList te krijgen, moet je even naar de ListModel interface kijken.
Dat hoeft niet. Als jij gewoon een JList aanmaakt met een vector of een array dan maakt hij onder de grond netjes een ListModel aan en vult die.

En hou verder rekening met het nivo van de topicstarter. Hij heeft niets aan 'te' goed advies.

[ Voor 13% gewijzigd door Alarmnummer op 25-09-2004 15:18 ]


  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 19:07
Alarmnummer schreef op 25 september 2004 @ 15:17:
[...]

Dat hoeft niet. Als jij gewoon een JList aanmaakt met een vector of een array dan maakt hij onder de grond netjes een ListModel aan en vult die.

En hou verder rekening met het nivo van de topicstarter. Hij heeft niets aan 'te' goed advies.
Inderdaad, dat kan ook, stom van mij.

Nog even een tipje voor de string weergave in je JList. Uit de objecten die je aan de array hebt toegevoegd wordt de string gehaald met de toString() methode. Wil je je eigen implentatie hiervan maken, dan moet je deze methode overriden.

EDIT: dit was ook al te zien in Alarmnummer zijn stukje voorbeeldcode

[ Voor 10% gewijzigd door JeroenTheStig op 25-09-2004 15:32 ]


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Ok, bedankt voor de uitleg. Ik denk dat ik nu wel weer even vooruit kan...

  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Daar ben ik weer, het lijkt me niet nodig een nieuw topic te openen dus doe ik het zo wel. Ik heb bovenstaande Object iets aangepast en verwerkt in mijn programma. Verder heb ik het volgende stuk code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private static void buddyControlPanel () {

    // Loading all people from db

    try {
        persons = DB.getBuddies ();
    }
    catch (Exception e) {

        System.out.println (e);
    }

     JFrame buddyControlPanel = new JFrame ("Buddy control panel");

     Container content =  buddyControlPanel.getContentPane ();

     DefaultListModel listModel = new DefaultListModel ();

     JList buddyList = new JList (listModel);

     JScrollPane scrollPane = new JScrollPane (buddyList);

     try {

         while (persons.next ()) {

             listModel.addElement (new Person (persons.getInt("ID"), persons.getString("FIRSTNAME"), persons.getString("LASTNAME")));
          }
      }
      catch (SQLException e) {

          System.out.println (e);
      }


Mijn vraag is of ik zo verder kan of moet ik echt voor elke persoon expliciet een nieuw object aanmaken met een naam? DB.GetBuddies geeft dus een ResultSet terug met alle data in die tabel. (id, firstname, lastname). Maar het gaat dus om het stuk "listModel.addElement (new Person (blabla)));"

Kan ik als ik het zo doe nog makkelijk het object aanroepen en zo gegevens opvragen of moet ik dus nagaan hoeveel objecten er gemaakt moeten worden door eerst het aantal rijen in de ResultSet te tellen en vervolgens voor elke persoon een nieuw object aanmaken met een logische regelmaat. (Person1, Person2 enz.)

Als ik het doe zoals nu en ik roep "persons.get (int index)" aan dan staat er dat ik een Object terug zou moeten krijgen. Gaat dat op deze manier lukken?

Ik heb het misschien een beetje vaag uitgelegd (het lijkt meer op een soort brainstormsessie) maar ik hoop dat iemand mij een beetje inzicht kan geven.
Verder heb ik het idee dat ik nogal vaak vastloop op dit soort praktische dingen en dat komt natuurlijk door een groot tekort aan ervaring. Hebben jullie nog sites o.i.d. waar juist wordt uitgelegd hoe je bepaalde dingen praktisch aanpakt?

[ Voor 8% gewijzigd door knopper op 26-09-2004 14:08 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Nadeel van je huidige aanpak is dat je de objecten in je GUI (DefaultListModel) opslaat. Dat limiteerd je tot het ophalen van de data (je personen).
Als je het in een andere structuur opslaat, SortedList, HashSet, HashMap etc, dan kan je makkelijker personen opvragen.
Nadelen:
- je moet je eigen ListModel maken
- of je moet een DefaultListModel en je andere structuur in dezelfde staat houden

Ik weet niet precies wat je persons object is, een ArrayList? Als je er persoon objecten in doet, dan komen er ook Persoon objecten uit. Alleen weet je compiler dat niet, dus moet je ze casten naar Persoon (vb.: Persoon persoon = (Persoon) list.get(5); )

"Beauty is the ultimate defence against complexity." David Gelernter


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Ja, dat is eigenlijk wat ik bedoelde, ik maak niet eerste losse objecten v.d. personen en gooi die dan in de lijst. Is dat wat je bedoelt?

Dus nu kan ik enkel de string ophalen die in de JList staat?

Het object Persons is het volgende:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Person {

        private long _id;
        private String _firstname;
        private String _lastname;

        public Person (long id, String firstname, String lastname) {

                _id = id;
                _firstname = firstname;
                _lastname = lastname;
        }

        public long getId () {

                return _id;
        }

        public String getFirstname () {

                return _firstname;
        }

        public String getLastname () {

                return _lastname;
        }

        public String toString () {

                return _lastname +", " +_firstname;
        }

}


Dus de code van een paar posts terug maar dan iets aangepast.

edit: Het enige wat ik moet weten is het bijbehorende id v.d. String in de JList. Die zou ik dus moeten kunnen achterhalen met Object.getId (). Maar hoe doe ik dat op deze manier zonder vantevoren een specifiek Object aan te maken voor een persoon. Tenzij iemand een suggestie heeft hoe ik het makkelijkste unieke objecten kan aanmaken met een logische naam.

[ Voor 16% gewijzigd door knopper op 26-09-2004 14:45 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Ik snap je niet helemaal. Er zitten Persoon objecten in je DefaultListModel en in je persons object (ArrayList?). Als een gebruiker een object in de lijst aanklikt dan weet je de index in de lijst, dan haal je dat object uit de lijst, en dat is dan die persoon.
Als je op een andere manier aan een id komt, en je wilt de bijbehorende persoon erbij zoeken. Dan kan je dat op 2 manieren doen:
elk persoon in de lijst afgaan en kijken of hij de goede is (linear search)
of gebruikt maken van een HashMap, maar dan moet je maar eerst even op de Sun java website kijken, naar de Collections framework. (Staat wel een grote discussie over ergens in dit forum, kan je ook even naar zoeken)

"Beauty is the ultimate defence against complexity." David Gelernter


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Stel ik doe "persons.get(1)", wat geeft dit dan als return waarde? De string in de JList of het Object? Zoals ik de code dus nu heb bedoel ik.

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Je hebt nergens je definitie van persons gedefinieerd. En ik zie nergens waar je de personen erin doet. Maar je krijgt eruit wat je erin doet. Als je er Persons objecten in doet, krijg je Persons objecten eruit.
Als persons je ListModel is, dan is het getElementAt(1), dan krijg je ook het Object zelf, en niet de String.

"Beauty is the ultimate defence against complexity." David Gelernter


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Ik weet dat ik nogal een noob ben op het moment, maar naar mijn inzicht is dit het punt waar ik de Person objecten erin gooi:

Java:
1
listModel.addElement (new Person (persons.getInt("ID"), persons.getString("FIRSTNAME"), persons.getString("LASTNAME"))); 


Vervolgens wordt hiervan de "toString()" methode van gebruikt om de juiste string (welke is achternaam, voornaam) in de lijst te zetten.

[ Voor 7% gewijzigd door knopper op 26-09-2004 15:43 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Ja, dan moet je listModel.getElementAt(int index) gebruiken om de objecten eruit te halen.

"Beauty is the ultimate defence against complexity." David Gelernter


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Helaas werkt het toch niet zoals ik bedoelde, als ik "listModel.get (indexnummer)" gebruik dan kan ik niet weer de functies gebruiken die bij de class Person horen. Daar doelde ik eigenlijk op.

Ik heb nu bijv. dit:

Java:
1
2
3
4
5
6
7
8
int selectedIndex = buddyList.getSelectedIndex ();
Object person = listModel.get (selectedIndex);

int id = person.getId ();

//System.out.println (person);

System.out.println (selectedIndex);


De juiste index wordt keurig uitgespuugd, echter als ik de eerste println uitcommentariseer dan wordt gewoon de string getoond zoals de functie toString() zou moeten doen. Probleem is alleen dat ik person als "Object" geen functies kan laten gebruiken v.d. class Person en als ik van "Object" "Person" maak dan krijg ik een fout over incompatible types.

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

knopper schreef op 26 september 2004 @ 17:18:
Helaas werkt het toch niet zoals ik bedoelde, als ik "listModel.get (indexnummer)" gebruik dan kan ik niet weer de functies gebruiken die bij de class Person horen. Daar doelde ik eigenlijk op.

Ik heb nu bijv. dit:

Java:
1
2
3
4
5
6
7
8
int selectedIndex = buddyList.getSelectedIndex ();
Object person = listModel.get (selectedIndex);

int id = person.getId ();

//System.out.println (person);

System.out.println (selectedIndex);


De juiste index wordt keurig uitgespuugd, echter als ik de eerste println uitcommentariseer dan wordt gewoon de string getoond zoals de functie toString() zou moeten doen. Probleem is alleen dat ik person als "Object" geen functies kan laten gebruiken v.d. class Person en als ik van "Object" "Person" maak dan krijg ik een fout over incompatible types.
Cast je wel goed? Je moet iets doen als:
Java:
1
Person p = (Person)listModel.get(selectedIndex);

Dat zorgt ervoor dat je de methoden van de klasse Person kan gebruiken.

Als ik eerlijk ben raad ik je aan eerst eens wat naar de basisbeginselen van Java te kijken, in plaats van direct met Swing GUIs en databases aan de gang te gaan. Succes ermee! :)

TheStreme - Share anything with anyone


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Nee, als ik naar jouw voorbeeld kijk dan cast ik niet goed.

Ja, het is allemaal leuk en aardig om alles zonder GUI te doen, maar ik vond dit zelf wel een goede oefening voor mezelf. En je moet me nageven, ik ben al een hoop dingen tegengekomen waar ik van heb geleerd. Overigens heb je wel gelijk dat ik de basisbegrippen nog eens door moet nemen, maar zoals iedereen heb ik daar geen zin/tijd voor/in... :D

Ik had dus:

Java:
1
Object person = listModel.get (selectedIndex);


En met een simpele:

Java:
1
Person person = (Person)listModel.get (selectedIndex);


zou het wel goed moeten gaan? Ik ben benieuwd...

  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Verdomd, het werkt idd.

Is dit basisstof m.b.t. Objecten/Klassen? Zo ja, dan ga ik dat gedeelte in mijn boek eens goed doorlezen...;)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18:07

Robtimus

me Robtimus no like you

Casting is idd vrij basic.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Topicstarter
Ok, gegevens toevoegen, bewerken in de database werkt nu naar behoren. Maar ik zit nu met het volgende, wat is de beste methode om de gegevens in de JList zelf te updaten?

Nu zit het gedeelte waar de databasegegevens worden opgevraagd in dezelfde functie als het weergeven van het JFrame met de JList. Is het zo het gemakkelijkste om naar het updaten van gegevens dit frame te sluiten en vervolgens de functie opnieuw aan te roepen, of werkt het ook als de code om de gegevens op te halen in een aparte functie zet, deze opnieuw uitvoer en vervolgens het de functie revalidate() uitvoer op JList? Wordt dan de while loop in die functie die de objecten in de JList zet ook opnieuw uitgevoerd?
Pagina: 1