Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Gegevens printen uit JTable

Pagina: 1
Acties:

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Op het moment ben ik bezig met een klein applicatie te schrijven, waarin mensen een orderlijst in de vorm van een JTable moeten invullen. Om te beginnen heb ik een JTable aangemaakt met 60 lege rows... dit is misschien wat omslachtig maar een andere methode kan ik zo snel niet vinden.

Wat ik nu wil doen, is op het moment dat de gebeuiker op "Save Order" klikt, (voorlopig) de data in de console wordt weergegeven. Echter heb ik continu te maken met NullPointerExceptions.

Ook als ik simpel de table.getColumnCount wil ophalen, en printen geeft hij de NullPointerException.
Java:
1
2
3
4
5
        int aantal_rijen = table.getRowCount();
        int aantal_kolommen = table.getColumnCount();

        System.out.println("Aantal rijen: " + aantal_rijen);
        System.out.println("Aantal kolommen: " + aantal_kolommen);


Ik twijfel of ik de JTable correct heb opgebouwd, omdat ik normaliter met een TableModel werk, maar omdat de tabel wel als een soort spreadsheet te zien krijg denk ik dat dit wel goed zit.

Ik hoor graag reacties, als er meer info noodzakelijk is hoor ik het ook wel.

Gr. Martijn

  • Standeman
  • Registratie: November 2000
  • Laatst online: 14:08

Standeman

Prutser 1e klasse

Ik gok even dat je table object null is. Maar als je meer specifieke code en de daadwerkelijke exception kan laten zien, wordt het waarschijnlijk een stuk duidelijker.

The ships hung in the sky in much the same way that bricks don’t.


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

NullPointer = je probeert iets te doen met een variable die niet gedeclareerd/geinitialiseerd is.

Going for adventure, lots of sun and a convertible! | GMT-8


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
niet schrikken, maar bij deze mijn table object
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
    private Object[][] data = { {"", "", "", "", "", ""}, {"", "", "", "", "",
                              ""}, {"", "", "", "", "", ""}, {"", "", "", "",
                              "", ""}, {"", "", "", "", "", ""}, {"", "", "",
                              "", "", ""}, {"", "", "", "", "", ""}, {"", "",
                              "", "", "", ""}, {"", "", "", "", "", ""}, {"",
                              "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}, {"", "", "", "", "", ""},
                              {"", "", "", "", "", ""}
    };


Ik ben nog steeds op zoek naar een oplossing... misschien dat het met een for-lus ook wel te regelen is.. ik wil dus een stuk of 50 lege rows creëren. Dit is dus een tijdelijke test-oplossing.

Exception
code:
1
2
3
4
5
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

    at GUI.tabelSchrijven(GUI.java:266)

    at GUI$3.actionPerformed(GUI.java:205)


Regel 266 is de regel dat die de getRowCount naar een int moet zetten, bij 205 wordt de methode aangeroepen.

Verwijderd

Ik denk dat je wel beseft dat dit niet de manier is he... Ik zie niet in waarom je je in die objectarray al die haakjes zou moeten zetten. Is het trouwens niet handiger om die contructor met vectoren te gebruiken?
Die nullpointer komt waarschijnlijk gewoon van je JTable object dat null is. Debug eens en kijk is wat er juist null is? (Gebruik bv. Ant, als je in Eclipse werkt)

Voor de rest: Als je Java code post, gebruik dan echte java code tags, dan krijgt je code de juiste syntax highlighting. (code="Java" gebruiken).

En groeten doen wordt hier niet gedaan...Wij Tweakers doen elkaar contstant de groeten ;)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 30-11 13:40

Robtimus

me Robtimus no like you

Gokje:
table is een private field in je class.
In je constructor denk je die als volgt te initialiseren:
Java:
1
JTable table = new JTable(....);

Gevolg: je maakt een nieuwe JTable aan maar die wordt nooit geassigned aan je private field maar aan een local variable.

Veel gemaakte fout ;)

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


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 29-11 23:56
Teeno schreef op dinsdag 04 september 2007 @ 16:32:
niet schrikken, maar bij deze mijn table object

<Schrik! Knip!>
Dat is dus geen table object, maar data die je in je table wil hebben. Heb je wel een tabel gemaakt?

Zoiets dus:
Java:
1
table = new JTable(data, new Object[]{"k1", "k2", "k3", "k4", "k5", "k6"});

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 28-11 23:34

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op dinsdag 04 september 2007 @ 17:32:
Ik zie niet in waarom je je in die objectarray al die haakjes zou moeten zetten.
Is het trouwens niet handiger om die contructor met vectoren te gebruiken?
Zo werk je in java met multi-dimensionale arrays. Het lijkt mij overigens ook handiger om met een List/Vector te gebruiken en die met een loopje te vullen. Nog makkelijker is waarschijnlijk om met een custom TableModel te werken die minimaal het gewenste aantal rows teruggeeft (60 oid dus) en lege strings / null (als dat mag volgens de spec) voor waardes die nog niet ingevuld zijn. Eigenlijk hetzelfde als nu dus, maar je kunt dan makkelijker aan door de gebruiker gewijzigde data komen (wordt dacht ik geset op het model door JTable).
Die nullpointer komt waarschijnlijk gewoon van je JTable object dat null is. Debug eens en kijk is wat er juist null is? (Gebruik bv. Ant, als je in Eclipse werkt)
:? Ant is een build-tool, wat dat met debuggen te maken heeft ontgaat me volkomen.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Zo werk je in java met multi-dimensionale arrays.
Excuseer? Een object array aanmaken kan toch nog altijd als:
Java:
1
Object[][] array=new Object[60][20]

In plaats van wat de TS schrijft...
Voor de rest ben ik het roerend eens met je.

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Verwijderd schreef op dinsdag 04 september 2007 @ 23:43:
[...]

Excuseer? Een object array aanmaken kan toch nog altijd als:
Java:
1
Object[][] array=new Object[60][20]

In plaats van wat de TS schrijft...
Voor de rest ben ik het roerend eens met je.
Met dank aan dit stukje code heb ik de lelijke haakjes uit mijn code kunnen verwijderen.

Hier bouw ik mijn tabel op

Java:
1
2
        DefaultTableModel dtm = new DefaultTableModel(array, columns);
        JTable table = new JTable(dtm);


De NullPointerException blijft nog.. ik zal even kijken of ik nog iets kan vinden

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:56
Misschien is het handig om even de code waar je de nullpointer op krijgt even te posten. Verder is niets zo makkelijk debuggen als een nullpointer, breakpoint op de betreffende regel en kijken wat er null is.

Roomba E5 te koop


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
sig69 schreef op woensdag 05 september 2007 @ 08:15:
Misschien is het handig om even de code waar je de nullpointer op krijgt even te posten. Verder is niets zo makkelijk debuggen als een nullpointer, breakpoint op de betreffende regel en kijken wat er null is.
Ik neem aan dat je het stukje code in mijn openingpost bedoelt, ik krijg de nullpointer op het moment dat hij enige gegevens (of dat nu data in een cell is, of het aantal rijen/kolommen) uit de table wil ophalen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:48

Janoz

Moderator Devschuur®

!litemod

TJa, als het op die regels is dan is table null. Table heeft dus geen waarde in die scope. De code uit de startpost staat waarschijnlijk niet binnen dezelfde scope als het andere stukje code dat je gepost hebt dus ik denk dat IceManX de oplossing al gegeven heeft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
oehh.. geweldig..

Ik heb
Java:
1
JTable table = new JTable(dtm);


Veranderd naar
Java:
1
table = new JTable(dtm);


En nu draait ie als een jecko... nog even kijken of hij ook celldata print en dan kan het kratje bier uit de schuur komen ;)

thnx

--edit-- wel iets waar je snel overheen kijkt trouwens

[ Voor 9% gewijzigd door Teeno op 05-09-2007 08:40 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:48

Janoz

Moderator Devschuur®

!litemod

Probeer ook eens voor jezelf duidelijk te krijgen waarom hij het nu wel doet. Lijkt me erg handig om dergelijke problemen in de toekomst te voorkomen (en volgende keer ook de reacties goed lezen, dan had je je probleem gisteravond al opgelost ;) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:56
Teeno schreef op woensdag 05 september 2007 @ 08:40:
--edit-- wel iets waar je snel overheen kijkt trouwens
Als je in notepad zit te coden wel ja, elke fatsoenlijke ide had er op zin minst een warning uitgegooid.

Roomba E5 te koop


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Janoz schreef op woensdag 05 september 2007 @ 08:41:
Probeer ook eens voor jezelf duidelijk te krijgen waarom hij het nu wel doet. Lijkt me erg handig om dergelijke problemen in de toekomst te voorkomen (en volgende keer ook de reacties goed lezen, dan had je je probleem gisteravond al opgelost ;) )
true, true... toch hoop ik een fout als deze niet meer te zullen maken... opzich wel weer een leermoment, net als dat ik nu weer de laatste waarde van mijn cellen als null op het scherm krijg, daar ga ik me vandaag maar weer mee bezig houden hehe ;)

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 28-11 23:34

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op dinsdag 04 september 2007 @ 23:43:
[...]

Excuseer? Een object array aanmaken kan toch nog altijd als:
Java:
1
Object[][] array=new Object[60][20]

In plaats van wat de TS schrijft...
Voor de rest ben ik het roerend eens met je.
Daarmee zijn dus alle elementen in je array op null geinitialiseerd, als dat is wat ts wil, dan is dit idd voldoende. Hij gebruikte echter eerder lege strings, dan werkt dit natuurlijk niet.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 26-11 15:31
Oftwel had meteen het advies van IceManX opgevolgd.

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
TukkerTweaker schreef op donderdag 06 september 2007 @ 09:53:
Oftwel had meteen het advies van IceManX opgevolgd.
Uhm.. en wie ben jij dan...

Deze mag op slot hoor, iedereen bedankt voor de hulp

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:48

Janoz

Moderator Devschuur®

!litemod

Topics gaan niet op slot omdat de oplossing gegeven is. Topics gaan alleen op slot wanneer deze niet aan de policy voldoet. Dit topic voldoet gewoon aan de policies dus gaat ook niet op slot. Waarom TukkerTweaker het nodig vindt om een dag later nog eens even te vertellen wat in het topic al meerdere keren aangehaald is is mij ook compleet onduidelijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 30-11 13:40

Robtimus

me Robtimus no like you

sig69 schreef op woensdag 05 september 2007 @ 09:08:
[...]

Als je in notepad zit te coden wel ja, elke fatsoenlijke ide had er op zin minst een warning uitgegooid.
Dan noem jij Eclipse dus een niet-fatsoenlijke IDE. Die geeft je nml geen warnings omdat zowel de lokale variabele (bij het toevoegen aan de rest van de user interface) als het private field (in de methods) worden gebruikt is geen van beide dus geen unused variable.

Het enige dat IDEs / compilers zouden kunnen ontdekken is een ongeinitialiseerd private field, maar dat is extreem lastig te ontdekken omdat die op elk punt in de code in principe een waarde kan krijgen.

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


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:48

Janoz

Moderator Devschuur®

!litemod

Eclipse geeft geen warning, maar er is wel een kleurverschil tussen een methode variabele en een class variabele. Daarnaast zul je ook een 'might not be initialised'-warning kunnen krijgen. Dat laatste weet ik niet zeker. Ik werk tegenwoordig met een oude versie van WSAD, gebaseerd op eclipse 2.x dus ik kan het nu even niet proberen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:56
IceManX schreef op donderdag 06 september 2007 @ 16:58:
[...]
Dan noem jij Eclipse dus een niet-fatsoenlijke IDE. Die geeft je nml geen warnings omdat zowel de lokale variabele (bij het toevoegen aan de rest van de user interface) als het private field (in de methods) worden gebruikt is geen van beide dus geen unused variable.
Je hebt gelijk zie ik nu net (even geprobeerd). Eclipse doet het inderdaad niet. Ik werk de laatste tijd meer in Visual Studio en die doet het wel, misschien dat ik daardoor aannam dat Eclipse het ook deed.

Roomba E5 te koop


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Het is officieel ook niet verkeerd; als iemand een class variabele en / of een lokale variabele van hetzelfde type en dezelfde naam wil hebben, dan kan / mag dat gewoon. Of de gebruiker dat nu per ongeluk doet is zijn eigen schuld, kwestie van gewoonten etc. Daarom gebruik ik altijd this.veld ipv gewoon veld in de meeste gevallen.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 30-11 13:40

Robtimus

me Robtimus no like you

Janoz schreef op vrijdag 07 september 2007 @ 09:19:
Eclipse geeft geen warning, maar er is wel een kleurverschil tussen een methode variabele en een class variabele.
Out-of-the-box niet (3.1), dat zul je zelf handmatig moeten instellen.
YopY schreef op vrijdag 07 september 2007 @ 12:13:
Het is officieel ook niet verkeerd; als iemand een class variabele en / of een lokale variabele van hetzelfde type en dezelfde naam wil hebben, dan kan / mag dat gewoon. Of de gebruiker dat nu per ongeluk doet is zijn eigen schuld, kwestie van gewoonten etc. Daarom gebruik ik altijd this.veld ipv gewoon veld in de meeste gevallen.
Je kan ook aanzetten dat hij een warning geeft bij variable shadowing, alleen is dat niet handig in setters want dan krijg je constant warnings ;)

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

Pagina: 1