[java] naamloos JTextField uitlezen?

Pagina: 1
Acties:

  • Wbdsgnr
  • Registratie: Maart 2002
  • Laatst online: 01-04 07:40

Wbdsgnr

Discombobulated?

Topicstarter
Als stageopdracht moet ik een programma afmaken van mijn voorganger, deze maakt aan de hand van enkele hashtables een layout aan in swing. Erg makkelijk met het opbouwen van een layout, maar uitlezen is een ander verhaal. Is het uberhaupt mogelijk om bijvoorbeeld een tfield uit te lezen? Aangezien er een stuk of 10 JTextFields worden aangemaakt met de variable naam tfield, heb ik

tfield.setName(...);

toegevoegd, maar ik kom er verder niet uit... Ironisch genoeg heb ik nog niks kunnen vinden op google noch sun.com...

Ik dacht iets in de richting van

waarde = tfield.getName().equals("portname").getText();

maar niet al te gek werkt dit niet aangeziend equals een boolean terug geeft...


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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
        while(groupkeys.hasMoreElements())
        {
            String groupname=groupkeys.nextElement();
            SettingsGroup group=groups.get(groupname);
            
            JPanel panel=new JPanel();

            panel.setLayout(null);
            
            int ypos=5;
            
            //get all settings contained in this group, create a label and textfield
            Hashtable<String,Setting> settings=group.getSettings();
            Enumeration<String> settingkeys=settings.keys();
            
            while(settingkeys.hasMoreElements())
            {
                String settingname=settingkeys.nextElement();
                Setting setting=settings.get(settingname);
                
                JLabel label=new JLabel(setting.getDescription());
                label.setBounds(5,ypos,200,20);
                
                panel.add(label);                
                
                
                //check if the contained value is a string/integer or boolean and match the way of editting
                Object val=setting.getValue();

                if (val instanceof Boolean)
                {
                    cfield=new JCheckBox();
                    cfield.setName(setting.getValue().toString());  // om te onderscheiden
                    cfield.setSelected((Boolean)val);
                    cfield.setBounds(205, ypos, 200, 20);
                    panel.add(cfield);
                }
                else
                {                
                    //JTextField 
                    tfield=new JTextField(setting.getValue().toString());
                    tfield.setBounds(205, ypos, 200, 20);
                    tfield.setName(setting.getValue().toString());  // om te onderscheiden
                    //field.addFocusListener(this);
                    panel.add(tfield);
                }
                
                ypos+=25;
            }

            tabpane.addTab(groupname,panel);        
        }

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Die tfield en cfield hebben alleen betekenis binnen die while. Het is niet een of andere wrapper of collection waarin vervolgens alle waarden opgeslagen worden?

Hoe kom je trouwens aan deze opdracht? De vraag die je hier stelt doet mij vermoeden dat je nog nauwelijks ervaring hebt met programmeren/java.

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


  • Wbdsgnr
  • Registratie: Maart 2002
  • Laatst online: 01-04 07:40

Wbdsgnr

Discombobulated?

Topicstarter
Ik heb tfield en cfield wel public gedeclareerd in het begin van de class, ze ontstaan niet in de whileloop... Ik heb inderdaad niet heel veel ervaring met java, maar het reikt wel verder dan scopes ^^ Dit is trouwens alleen een gedeelte van de code, het hele programma is wel iets groter... Voorzover ik weet zijn het ordinaire textfields die ik probeer uit te lezen... :)

  • Standeman
  • Registratie: November 2000
  • Nu online

Standeman

Prutser 1e klasse

Java:
1
waarde = tfield.getName().equals("portname").getText();


Wat je hier doet is een getText() method afroepen op een boolean. Aangezien primitives geen methods hebben en dus ook een boolean niet, gaat dit natuurlijk fout..

Wat wel kan is:

Java:
1
2
3
if (tfield.getName().equals("portname")) {
  waarde = tfield.getText();
}


nofi overgens, maar dit is een vrij eenvoudige (OO-)programmeer vaardigheid (zoals Janoz al opmerkte). Misschien moet je 's goed de basis java tutorial eens lezen, dat zal je een heel eind op weg helpen met het aanpassen van andersman code.

[ Voor 37% gewijzigd door Standeman op 06-10-2005 14:10 ]

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


  • Wbdsgnr
  • Registratie: Maart 2002
  • Laatst online: 01-04 07:40

Wbdsgnr

Discombobulated?

Topicstarter
Wbdsgnr schreef op donderdag 06 oktober 2005 @ 13:18:...maar niet al te gek werkt dit niet aangeziend equals een boolean terug geeft...
Heb ik ook al geprobeerd, maar hij geeft altijd false terug, dus er moet een andere manier zijn... :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 29-04 14:22

momania

iPhone 30! Bam!

Wbdsgnr schreef op donderdag 06 oktober 2005 @ 13:57:
Ik heb tfield en cfield wel public gedeclareerd in het begin van de class, ze ontstaan niet in de whileloop...
Dat is iedere keer maar een referentie naar een JTextField die je in je while steeds vult met een nieuwe JTextField en dan toevoegd aan je panel.

De referentie die je overhoud in de variable 'tfield' is dan naar de laatst aangemaakte JTextField. De rest ben je gewoon kwijt.

Neem je whisky mee, is het te weinig... *zucht*


  • Standeman
  • Registratie: November 2000
  • Nu online

Standeman

Prutser 1e klasse

momania schreef op donderdag 06 oktober 2005 @ 14:10:
[...]

Dat is iedere keer maar een referentie naar een JTextField die je in je while steeds vult met een nieuwe JTextField en dan toevoegd aan je panel.

De referentie die je overhoud in de variable 'tfield' is dan naar de laatst aangemaakte JTextField. De rest ben je gewoon kwijt.
Niet helemaal. Deze zijn vast nog wel ergens op het panel te vinden waar ze op geplaatst worden.

Ik heb even snel in API gekeken en daar kan ik geen methods vinden om de children van een Container uit te vragen.. Nooit verwacht dat dat niet kon.

enfin, het is nog simpel op te lossen door ze in een Set / Hashtable te zetten en hierover te itereren wanneer je ze wilt uitlezen :)
edit:

(leuk... 3x dezelfde oplossing.. en de mijn mijn was al laatste ;()

[ Voor 30% gewijzigd door Standeman op 06-10-2005 14:16 ]

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


  • momania
  • Registratie: Mei 2000
  • Laatst online: 29-04 14:22

momania

iPhone 30! Bam!

Standeman schreef op donderdag 06 oktober 2005 @ 14:11:
[...]


Niet helemaal. Deze zijn vast nog wel ergens op het panel te vinden waar ze op geplaatst worden.
dat wel, maar in eerste instantie worden ze nergens bewaard :)


Je kan ze het best, zoals Janoz al aangaf, in een collection bewaren.. simpel voorbeeld:
Java:
1
2
3
4
5
6
Map fields = new HashMap();
while (iets) {
  JTextField field = new JTextField();
  field.setName(name);
  fields.put(name, field);
}


Dan kan je later via een naam een veld weer ophalen:
Java:
1
JTextField field = (JTextField)fields.get(name);

Neem je whisky mee, is het te weinig... *zucht*


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-04 03:55

Nick_S

++?????++ Out of Cheese Error

^^^ Met hem, dus.

Sla al je textfields op in een hashmap met als key de naam. Dan kun je ze later ook weer terug vinden.

Grumbl, weer te laat...

[ Voor 32% gewijzigd door Nick_S op 06-10-2005 14:18 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 29-04 15:38

Robtimus

me Robtimus no like you

Standeman schreef op donderdag 06 oktober 2005 @ 14:11:
Ik heb even snel in API gekeken en daar kan ik geen methods vinden om de children van een Container uit te vragen.. Nooit verwacht dat dat niet kon.
Eh:
public int getComponentCount()
public Component getComponent(int i)
public Component[] getComponents()
public Component getComponentAt(int x, int y)
public Component getComponentAt(Point p)

Die eerste drie zelfs zonder API kunnen opsommen ;)

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


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 29-04 15:38

Robtimus

me Robtimus no like you

momania schreef op donderdag 06 oktober 2005 @ 14:15:
Je kan ze het best, zoals Janoz al aangaf, in een collection bewaren..
offtopic:
Technisch gezien is een Map geen Collection ;)
Maar wel de beste oplossing ja

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


  • momania
  • Registratie: Mei 2000
  • Laatst online: 29-04 14:22

momania

iPhone 30! Bam!

IceManX schreef op donderdag 06 oktober 2005 @ 14:41:
[...]
offtopic:
Technisch gezien is een Map geen Collection ;)
Maar wel de beste oplossing ja
offtopic:
true, alleen een collection interface, maar dat mag de pret niet drukken :P

Neem je whisky mee, is het te weinig... *zucht*


  • Standeman
  • Registratie: November 2000
  • Nu online

Standeman

Prutser 1e klasse

IceManX schreef op donderdag 06 oktober 2005 @ 14:39:
[...]
Eh:
public int getComponentCount()
public Component getComponent(int i)
public Component[] getComponents()
public Component getComponentAt(int x, int y)
public Component getComponentAt(Point p)

Die eerste drie zelfs zonder API kunnen opsommen ;)
ahhaa.. ik was even snel op zoek naar een collection die getChildren() ofzo zou heten..

offtopic:
.NET maakt meer Java kennis stuk dan je lief is ;(
Ben weer lekker bezig vandaag...

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


  • netvor
  • Registratie: September 2000
  • Laatst online: 08-04-2024
Wat je ook kan doen, is je Setting class aanpassen door er een field
Java:
1
private JComponent component;
in te zetten, die je met een mooie method
Java:
1
public Object getComponentValue( ) { ... }
uit kan lezen. Dat maakt het allemaal een stuk transparanter voor je. Je hoeft in je applicatie alleen maar de hashmap met alle settinggroups (en daarin alle settings) bij de hand te houden, en vanuit die hashmap kan je automagisch de UI uitlezen.

Computer Science: describing our world with boxes and arrows.


  • Wbdsgnr
  • Registratie: Maart 2002
  • Laatst online: 01-04 07:40

Wbdsgnr

Discombobulated?

Topicstarter
Hmm.. Inderdaad, bedankt voor de reacties allemaal, hier kom ik weer een stuk verder mee!
Pagina: 1