[JAVA]-Mehode die een string terug geeft

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

  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Hallo mensen,

Ik zit met het volgende probleem. Ik ben een beetje aan het klooien met trees. Wat ik wil is dat je een tree krijgt met een allemaal landen. Ik heb er nu gewoon een aantal gekozen. Maar ik wil in de subtree allemaal eigenschappen zetten van die landen met als belangrijkste eigenschap: de tijd.
Nu had ik dus nog een klasse: "Digital Clock" staan. Ik heb deze klasse iets aangepast. Het enige wat die klasse moet doen is de juiste tijd terug geven. Dat doet ie ook want als ik Sysyem.out.println(); gebruik dan lijkt ie de juiste tijden uit te spugen. Het probleem is dat ie ze niet wil opnemen in de tree. Ik post hier mijn code, kunnen jullie mij vertellen wat ik fout doe want ben er al een tijdje mee bezig maar krijg het niet voor elkaar.


Eerst DigitalClock.java
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package Tree; 

    import java.awt.Panel; 
    import java.awt.Label; 
    import java.awt.Font; 
    import java.awt.Color; 
    import java.util.Calendar; 
    import java.util.Date; 
    import java.util.Locale; 
    import java.util.TimeZone; 
    import java.text.DateFormat; 
    import java.text.SimpleDateFormat; 
    import javax.swing.SwingUtilities; 


     
    class DigitalClock extends Panel implements Runnable 
    { 
        private Label timeToShow; 
        private Font timeFont = new Font("Arial", Font.BOLD, 14); 
        private Label currentDayLabel; 
        private Label labels; 
        private String location; 
        private String time; 
        private Time time; 


        DigitalClock(String location, String time) 
        { 
            this.time = time; 
            this.location = location; 
            timeToShow = new Label(); 
            timeToShow.setFont( timeFont ); 
            timeToShow.setForeground(new Color(255, 255, 255)); 
            timeToShow.setBounds(20, 0, 80, 25); 
            add( timeToShow ); 

            Thread thread = new Thread(this); 
            thread.setDaemon(true); 
            thread.start(); 

            String now = DateFormat.getTimeInstance().format(new Date()); 
            int minutes = Integer.parseInt( 
            now.substring(now.length() - 5, now.length() - 3)); 
            int hours = Integer.parseInt(now.substring( 0, now.indexOf(":"))); 
        } 

        public synchronized void setLocation(String location,String time) 
        { 
            this.location = location; 
        } 

        public void run() 
        { 
            while ( true ) 
        { 
            String location; 
            synchronized(this) 
            { 
                if (this.location.equals("Nederland"))
    {
     location = "GMT+01:00";
    }
    else if (this.location.equals("New York"))
    {
     location = "GMT-08:00";
    }
    else if (this.location.equals("Israel"))
    {
     location = "GMT+02:00";
     }
     else
     {
        location = "GMT+01:00";
     }        
} 
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); 
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone(location)); 



        final String now = simpleDateFormat.format(new Date()); 
        //boolean bool = TimeZone.inDaylightTime(now); 

        SwingUtilities.invokeLater( new Runnable() 
        { 
            public void run() 
            { 
                    time=now; 
                    //System.out.println(time); 

            } 
        }); 

        try 
        { 
            Thread.currentThread().sleep(900); 
        } 
        catch(InterruptedException e) 
        { 
            break; 
        } 
            catch (Exception e) 
        { 

        } 

        int seconds = Integer.parseInt( 
        now.substring(now.length() - 2, now.length())); 
        int minutes = Integer.parseInt( 
        now.substring(now.length() - 5, now.length() - 3)); 
        int hours = Integer.parseInt( 
        now.substring(0, now.indexOf(":"))); 
        } 
    } 

}

En hier TreeDemo.java
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package Tree; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.tree.*; 
import javax.swing.event.*; 

public class TreeDemo extends JFrame implements TreeSelectionListener 
{ 
  public static void main(String[] args) 
  { 
    new TreeDemo(); 
  } 

  private JTree tree; 
  private JTextField currentSelectionField; 
  private String[] country = {"Nederland", "New York", "Israel", "Parijs"}; 
  private int i=0; 
  private DigitalClock[] dg = new DigitalClock[3]; 
  private String[] time = new String[4]; 

  public TreeDemo() 
  { 
    super("Timezones"); 
    WindowUtilities.setNativeLookAndFeel(); 
    addWindowListener(new ExitListener()); 

    Container content = getContentPane(); 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("Timezones"); 
    DefaultMutableTreeNode child; 
    DefaultMutableTreeNode grandChild; 

    for(int childIndex=1; childIndex<4; childIndex++) 
    { 
      child = new  DefaultMutableTreeNode(country[childInde
x-1]); 
      root.add(child); 
      for(int i=1; i<2; i++) 
      { 


        DigitalClock dg= new DigitalClock(country[childIndex-1],time[childIndex-1]); 
        System.out.println(time[childIndex-1]); 
        grandChild = 
          new DefaultMutableTreeNode("Huidige tijd" + 
                                     "." + country[childIndex-1]+ time); 
        child.add(grandChild); 
      } 
    } 

    tree = new JTree(root); 
    tree.addTreeSelectionListener(this); 
    content.add(new JScrollPane(tree), BorderLayout.CENTER); 
    currentSelectionField = new JTextField("Current Selection: NONE"); 
    content.add(currentSelectionField, BorderLayout.SOUTH); 
    setSize(250, 275); 
    setVisible(true); 
  } 

  public void valueChanged(TreeSelectionEvent event) 
  { 
    currentSelectionField.setText 
      ("Current Selection: " + 
       tree.getLastSelectedPathComponent().toString()); 
  } 
}


Wie kan me hiermee helpen?

[ Voor 13% gewijzigd door Jigs op 15-12-2004 08:46 ]


  • Onno
  • Registratie: Juni 1999
  • Niet online
Het helpt meestal wel als je ook even vertelt wat er waar fout gaat, wat voor foutmelding je krijgt, enz. :)

  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Ik krijg geen foutmelding. Hetgeen wat er gebeurt is dat ik probeer vanuit de klasse DigitalClock een string met de juiste tijd te sturen naar de klasse TreeDemo. Als je de print screen in het stukje

Java:
1
2
3
4
5
6
7
8
9
SwingUtilities.invokeLater( new Runnable() 
{ 
  public void run() 
  { 
   time=now; 
   //System.out.println(time); 

   } 
}); 


activeerd, dan zie je dat de juiste tijd wordt afgegeven door de klasse. Het probleem is dat de klasse TreeDemo hem niet op pikt.
Hoe los ik dit op?

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 18-05 10:29
Kun je niet gewoon de methode de string laten retourneren?
Java:
1
2
3
4
5
public String getDatum() {
    // hier een hoop code
    String outputDatum = "blaat";
    return outputDatum;
}

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Daar heb ik ook al mee zitten knoeien maar dat is me niet echt gelukt.
Ik heb exact deze klasse (DigitalClock) gebruikt om de tijden terug te geven naar een label in een andere classe. toen was de code label.setText(now); voldoende. Ik gaf dus de waarde terug aan een label. Maar nu wil ik het gewoon als string terug geven. Lukt niet echt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Jigs schreef op dinsdag 14 december 2004 @ 09:14:
Daar heb ik ook al mee zitten knoeien maar dat is me niet echt gelukt.
Ik heb exact deze klasse (DigitalClock) gebruikt om de tijden terug te geven naar een label in een andere classe. toen was de code label.setText(now); voldoende. Ik gaf dus de waarde terug aan een label. Maar nu wil ik het gewoon als string terug geven. Lukt niet echt.
Wat heb je nu allemaal al geprobeerd? Wat lukte er niet? Kreeg je foutmeldingen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Nouja ik heb diverse dingen geprobeerd.
Ik heb geprobeerd om dit soort code te gebruiken
code:
1
2
3
4
5
public String getDatum() { 
    // hier een hoop code 
    String outputDatum = "blaat"; 
    return outputDatum; 
}


Ik heb wat zitten rommelen met de waarden die terug gegeven worden door bijvoorbeeld dezelfde benamingen te gebruiken maar ik krijg het gewoonweg niet voor elkaar.
Ik krijg geen foutmeldingen. Het compiled lekker, ik krijg geen stackTrace maar het werkt gewoon niet. Ik krijg gewoon ipv mijn waarde: NULL te zien.
Wie o wie kan me hierbij helpen?

Verwijderd

Zou je je openingspost kunnen editten?
Als je in plaats van [ code ] [ /code ] voor je code [ code=java ] en [ /code ] gebruikt, krijgt de code in ieder geval java-kleurtjes.
Verder zou een beetje commentaar in je code van welk stuk verantwoordelijk is voor wat het lezen ook wat makkelijker maken.
Misschien moet ik me ook niet om half 12 aan dergelijke topics wagen, maar ik kan me voorstellen dat ik niet de enige ben die na de halve post zijn concentratie verliest...

ligt het aan mij of zouden die quotes in je digitalclock bij location geescaped moeten worden :?
volgens mij kan
Java:
1
location = "GMT+01[img]"images/smilies/hypocrite.gif"[/img]0";

nooit succesvol door de compiler gegaan zijn
En time is zowel een String als een Time... :?
Dit kan dus ook niet:
Java:
1
2
        private String time; 
        private Time time; 


Als ik zo naar je TreeDemo kijk, zet je nooit wat in die timeArray die je vervolgens uitprint.

overigens denk ik dat for(int i=1; i<2; i++) ook niet zo heel erg zinvol is...

edit:
woei kleurtjes :)

[ Voor 47% gewijzigd door Verwijderd op 15-12-2004 00:02 ]


  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Ok ik heb die code even aangepast.
Ik begrijp niet hoe die images ertussen komen. Ik ben nu ook het een en ander aan het uitproberen.
Ik denk dat het zo moet:
Je moet voor elke "grand child" een instantie maken van DigitalClock en dan moet je als parameter het betreffende land meegeven. Dat gebeurt ook. Nu moet je er ook voor zorgen dat als DigitalClock een waarde terug geeft, dat je er wat mee kan. De vraag is alleen, hoe moet je dat realiseren? Daar ben ik nog niet helemaal uit.
Ik denk dat ik iig de constructor van DigitalClock zal moeten aanpassen naar:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DigitalClock(String location)
{
            this.time = time;
            this.location = location;
            timeToShow = new Label();
            timeToShow.setFont( timeFont );
            timeToShow.setForeground(new Color(255, 255, 255));
            timeToShow.setBounds(20, 0, 80, 25);
            add( timeToShow );

            Thread thread = new Thread(this);
            thread.setDaemon(true);
            thread.start();

            String now = DateFormat.getTimeInstance().format(new Date());
            int minutes = Integer.parseInt(
            now.substring(now.length() - 5, now.length() - 3));
            int hours = Integer.parseInt(now.substring( 0, now.indexOf(":")));
        }


En dan aanroepen met:

Java:
1
DigitalClock dg= new DigitalClock(country[childIndex]);

Maar hoe nu verder?

[ Voor 3% gewijzigd door Jigs op 15-12-2004 08:56 ]


Verwijderd

wat je bedoeling is, als ik het goed begrijp, is om meerdere klokken in een tree te laten zien.
wat ik niet terug kan vinden is waar je je Tree laat weten dat de waardes van je treenodes zijn veranderd.

kijk hier eens voor een tutorial over trees. en dan vooral het kopje "Dynamically Changing a Tree"
je moet dan namelijk zelf events gaan afvuren als je treemodel veranderd is en je display moet worden aangepast
en de makkelijkste manier om dit voor elkaar te krijgen is om de rootnode in een DefaultTreeModel te stoppen, en die dan weer in je tree te stoppen.
en als je dan je nodes verandert kan je m.b.v. DefaultTreeModel.nodeChanged(TreeNode node) de gui updates triggeren, zodat de nieuwe waardes ook te zien zijn. of alle updates in 1 keer met DefaultTreeModel.reload()
en nog een tip. zet alleen een tijds-string en een locatie/tijdzone in je treenodes en maak maar 1 klok die elke seconde alle treenodes die zichtbaar zijn update, dat scheelt een berg threads, geheugen en cpu gebruik

[ Voor 20% gewijzigd door Verwijderd op 15-12-2004 13:13 ]


  • Jigs
  • Registratie: April 2004
  • Laatst online: 09-12-2025
Ik denk dat je niet helemaal door hebt wat ik wil. De tree opzich veranderd niet. Misschien dat ik dat in de toekomst wel wil maar dat is nu nog heel even niet aan de orde. Waar het mij om aat is dat de grandchilds in dit geval er al zijn. Ze moeten alleen hun gegevens hergens vandaan halen. Dit krijgen ze uit de klasse DigitalClock. De vraag is hoe en dat heeft volgens mij niks te maken met dynamische trees. Maar iig bedankt voor de tip
KoenieMan schreef op dinsdag 14 december 2004 @ 09:11:
Kun je niet gewoon de methode de string laten retourneren?
Java:
1
2
3
4
5
public String getDatum() {
    // hier een hoop code
    String outputDatum = "blaat";
    return outputDatum;
}
KoenieMan shrijft: // hier een hoop code.
Maar welke code dan? Moet dat dan andere code zijn dan die ik al heb in DigitalClock?
Kan iemand me het dan even in pseudo aangeven?

[ Voor 36% gewijzigd door Jigs op 15-12-2004 15:43 ]


Verwijderd

de treestructuur verandert niet bij jou, de tree verandert weldegelijk, immers je waardes in je treenodes veranderen en daarom je weergave van de tree ook.

als dat gebeurt heb je een dynamische tree, ook al verandert de structuur van je tree niet.
zie hier voor een voorbeeld.
er staan niet zoveel comments in de code, maar als je er ff naar kijkt zie je de structuur die erin zit

de truuk zit het hem erin dat jou grandchildren niet zichzelf moeten updaten, maar geupdate worden door een controller class, (een klok in dit probleem), want anders moet je een heleboel omwegen maken om alle "grandChildren" zelf hun gegevens te laten vinden
en ik zou de Swing tegenhangers gebruiken van de awt componenten die jij gebruikt.
JLabel ipv Label enzo.
doorelkaar gebruiken van swing en awt is niet zo verstandig ( heb ik gehoord, correct me if i'm wrong)


uitleg bij mijn voorbeeldje:
de Tree, TreeNodes, Treemodel en ClockData zijn dus "dom", en houden zich alleen bezig met hoe het display eruitziet.

ClockRenderer is een sub-klasse van JLabel die je eventueel kan uitbreiden om er een custom look aan te geven
(doe hem dan wel ff aan de tree hangen met Gui.setTreeCellRenderer())

TreeClock is de klasse met de main() erin en zorgt voor een beetje setup.

Clock is de controller. die update elke seconde de tree en triggert een display update met tm.reload();
Clock heeft ook een lijst aan boord met alle nodes die ge-update moeten worden door hem

UpdateClockDisplayCommand is een hulpklasse met een veel te lange naam die zorgt voor de daadwerkelijke verandering van de treenodes, m.b.v. SwingUtilities.invokeLater(new UpdateClockDisplayCommand(...) );

en Gui is de gui ( duh :+ )
nog een ps-je
de code is GEEN productie kwaliteit, meer een proof of concept. d'r moet nog aardig wat gebeuren aan de thread-veiligheid van de Clock enzovoorts

[ Voor 81% gewijzigd door Verwijderd op 15-12-2004 17:30 ]

Pagina: 1