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

[JAVA] Textbox probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een client server systeem gebouwd. Nu heb ik alleen alle output op de server in eenconsole line. Maar ik wil dit graag in een textbox zetten. In de main klasse staat een functie die de textbox vult.

code:
1
2
3
4
5
public void setStatus(String input)
{
    this.status = this.status + input;
                txt_output.setText(this.status);
}


Nu krijg ik op geen enkele manier vanuit een andere klasse een string in de tekstbox. Dit kan wel:

code:
1
2
3
4
5
6
public void setStatus(String input)
{
    this.status = this.status + input;
                System.out.println(this.status);
                txt_output.setText(this.status);
}


Hoe zorg ik dat de string wel aan de textbox toegevoegd wordt? De string komt dus wel aan in de functie maar wordt op de 1 of andere manier niet in de textbox gezet.

[ Voor 6% gewijzigd door Verwijderd op 12-09-2007 20:03 ]


  • Daspeed
  • Registratie: Maart 2001
  • Nu online
is debuggen een optie?

Verwijderd

Topicstarter
Ja natuurlijk, maar debuggen biedt weinig duidelijkheid...

  • Daspeed
  • Registratie: Maart 2001
  • Nu online
waar wordt txt_output gedeclareerd en geïnstantieerd?

misschien moet je even wat meer code plaatsen.

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
Met een goede debugger kan je gewoon een breakpoint in je code zetten en vervolgens de txt_output variabele "inspecteren" om te kijken wat voor waarde(n) die heeft. Dus je opmerking dat debuggen weinig duidelijkheid biedt is onzin.

Verwijderd

Topicstarter
txt_output wordt in de klasse Main.java gedeclareerd, daar wordt ook me JFrame gedeclareerd.

code:
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
public class Main extends javax.swing.JFrame {
    private JTextArea output;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Main inst = new Main();
                inst.setLocationRelativeTo(null);
                inst.setVisible(true);
            }
        });
    }
    
public Main() {
        super();
        initGUI();
}

// nog meer code----- //

//Functie die output toont in de textbox
public void setStatus(String input)
{
        
    this.status = this.status + input;
    txt_output.setText(this.status);
}


Vanuit een andere klasse doe ik het volgende:
code:
1
2
            Main test= new Main();
            test.setStatus("Hier komt het bericht...");

De text die ik er in wil stoppen vanuit een andere klasse komt er niet in, alles wat ik in de klasse Main doe komt er wel in.

  • Daspeed
  • Registratie: Maart 2001
  • Nu online
waar wordt txt_output gedeclareerd en geïnstantieerd?

Verwijderd

Topicstarter
in de functie initGUI();

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
jScrollPane1 = new JScrollPane();
                getContentPane().add(jScrollPane1);
                jScrollPane1.setBounds(7, 38, 389, 252);
                {
                    txt_output = new JTextArea();
                    jScrollPane1.setViewportView(txt_output);
                    txt_output.setBounds(7, 38, 311, 237);
                    txt_output.setEditable(false);
                    txt_output.setOpaque(false);
                    txt_output.setPreferredSize(new java.awt.Dimension(233, 250));
                    txt_output.addComponentListener(new ComponentAdapter() {
                    });
                }

  • Daspeed
  • Registratie: Maart 2001
  • Nu online
heb je niet te maken met 2 verschillende instanties van Main dan?

code:
1
2
Main inst = new Main();
Main test= new Main();

Verwijderd

Topicstarter
Denk ik niet, omdat de string die ik naar die funcite stuur wel daarin aankomt, omdat als ik die string via System.out.println toon, dan staat daar wel wat ik erin gestopt heb. Het enige wat dus niet gebeurd is dat deze aan de huidige this.status wordt toegevoegd en geplaatst wordt in de textbox.

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
DrClearbottom heeft wel degelijk gelijk hoor. Dat je string via sysout wel correct getoond wordt is een heel ander verhaal. Mocht DrClearbottom niet gelijk hebben dan zit je code te kopieren en plakken op dit forum waar geen snars van klopt.

Verwijderd

Topicstarter
Ik snap niet wat je bedoelt met twee instanties, ik heb toch maar 1 instantie nodig om die methode setStatus te bereiken?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
Verwijderd schreef op woensdag 12 september 2007 @ 20:22:
Vanuit een andere klasse doe ik het volgende:
code:
1
2
            Main test= new Main();
            test.setStatus("Hier komt het bericht...");

De text die ik er in wil stoppen vanuit een andere klasse komt er niet in, alles wat ik in de klasse Main doe komt er wel in.
Op de eerste regel van de bovenstaande code maak je een nieuwe (tweede) instantie aan van je Main klasse. Daarin zet je die tekst. Je zet de tekst dus niet in de instantie van de Main klasse die je hebt aangemaakt in je "public static void main(String args[])" methode.

Verwijderd

Topicstarter
Ja dat is inderdaad waar en logisch ook. Hoe roep ik dan die instantie aan vanuit een andere klasse? Ik kan het alleen aanroepen als ik er een nieuwe object van maak?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
Dat doe je door een referentie naar die instantie te gebruiken. Maar ik krijg sterk het idee dat je de basisprincipes van OO programmeren nog niet zo goed onder de knie hebt. Wellicht dat het verstandig is om je eerst wat meer te verdiepen in de materie, bijvoorbeeld Creating a GUI with JFC/Swing.

Verwijderd

Wat versta je hier dan precies onder een referentie? Simpelweg de naam die je meegeeft aan het object op moment van instantierën?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
Nee de variabele. Je kan ook twee referenties hebben naar 1 object/instantie op de onderstaande manier. Zowel a als b wijzen naar de instantie van String("a").

code:
1
2
String a = new String("a");
String b = a;

[ Voor 15% gewijzigd door Access op 12-09-2007 22:41 ]


Verwijderd

Access schreef op woensdag 12 september 2007 @ 22:35:
code:
1
2
String a = new String("a");
String b = a;
En dan de hamvraag: Hoeveel instanties van de String met letter a bestaan er in dit voorbeeld?

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 20:51

Koppensneller

winterrrrrr

Verwijderd schreef op woensdag 12 september 2007 @ 22:51:
[...]

En dan de hamvraag: Hoeveel instanties van de String met letter a bestaan er in dit voorbeeld?
En het antwoord is....

spoiler:
Eerst zelf nadenken!



spoiler:
1!


:+

Verwijderd

Access schreef op woensdag 12 september 2007 @ 22:35:
Nee de variabele. Je kan ook twee referenties hebben naar 1 object/instantie op de onderstaande manier. Zowel a als b wijzen naar de instantie van String("a").

code:
1
2
String a = new String("a");
String b = a;
Gaat het hier daadwerkelijk om een referentie of een kopie van de variabele? Volgens mij is het in dit geval een kopie zodat wanneer je nu de waarde van a veranderd de waarde van b niet meeveranderd.

In dit geval zou dat niet uitmaken want de waarde kun je dan alsnog er uit filteren en eventuele nieuwe berichten worden in de volgende cyclus opgehaald.

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 20:51

Koppensneller

winterrrrrr

Verwijderd schreef op woensdag 12 september 2007 @ 23:02:
[...]


Gaat het hier daadwerkelijk om een referentie of een kopie van de variabele? Volgens mij is het in dit geval zo dat wanneer je nu de waarde van a veranderd de waarde van b niet meeveranderd.

In dit geval zou dat niet uitmaken want de waarde kun je dan alsnog er uit filteren en eventuele nieuwe berichten worden in de volgende cyclus opgehaald.
String is een reference type. Bij andere reference types zou in bovenstaand voorbeeld een wijziging van a of b in dezelfde instantie worden doorgevoerd. Nu ligt dat met String echter anders dan met andere reference types, omdat het immutable is. Na een wijziging verwijzen ze a en b naar verschillende instanties.

Heb je nou een value type, zoals int, double of een struct, dan zou na wijzigen van variabele a, een verschil zijn tussen de waarden in a en b.

[ Voor 10% gewijzigd door Koppensneller op 12-09-2007 23:16 ]


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 20:51

Koppensneller

winterrrrrr

Ja toch? Of zit ik nou helemaal verkeerd te denken?

Het is al laat, begin aan mezelf te twijfelen :O

Pas als je een van de 2 gaat wijzigen zijn er twee instanties, omdat er bij een wijziging aan een String een nieuwe instantie wordt aangemaakt:

Java:
1
2
3
String a = new String("foo");
String b = a;
a = "bar";


Na uitvoering hiervan moet a de waarde "bar" hebben, en b de waarden "foo".

Verwijderd

Okay rephrase:
Java:
1
String a = new String("foo");

Hoeveel instanties van de String foo zijn er in dit voorbeeld?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 25-11 23:53
Weet je het antwoord zelf en ben je ons aan het uitvragen of heb je geen idee en wil je het antwoord weten?

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

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op woensdag 12 september 2007 @ 23:22:
Okay rephrase:
Java:
1
String a = new String("foo");

Hoeveel instanties van de String foo zijn er in dit voorbeeld?
Leuk instinkertje, maar wat wil je ermee bereiken?
spoiler:
2, "foo" is zelf ook een string object, die wordt dan gekopieerd door de constructor van String.

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


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 20:51

Koppensneller

winterrrrrr

NetForce1 schreef op donderdag 13 september 2007 @ 08:29:
[...]

Leuk instinkertje, maar wat wil je ermee bereiken?
spoiler:
2, "foo" is zelf ook een string object, die wordt dan gekopieerd door de constructor van String.
Die wordt echter snel weer opgeruimd door de garbage collector...

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

NetForce1 schreef op donderdag 13 september 2007 @ 08:29:
[...]

Leuk instinkertje, maar wat wil je ermee bereiken?
spoiler:
2, "foo" is zelf ook een string object, die wordt dan gekopieerd door de constructor van String.
Niet "foo" zelf overigens, maar de ernaar referentie wordt gekopieerd als value, immers pass-by-valuetype.

Voor de rest is dit gewoon een kwestie van een TS die java / OO nog niet in de vingers heeft. Terug de boeken in duiken dus.

[ Voor 33% gewijzigd door prototype op 13-09-2007 08:52 ]


Verwijderd

Access schreef op woensdag 12 september 2007 @ 23:38:
Weet je het antwoord zelf en ben je ons aan het uitvragen of heb je geen idee en wil je het antwoord weten?
Wat ik uiteindelijk wil is dat de copy contructor van String niet gebruikt wordt. De toepassing is er niet (of voor de azijnpissers onder ons: nauwelijks).

String is een vreemde eend in de bijt binnen Java. Tenminste op het eerste gezicht:
Java:
1
2
3
4
5
6
7
8
9
String a = "foo";
String b = "foo";
String c = new String("foo");
String d = new String(a);
String e = d.intern();
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a == d); // false
System.out.println(a == e); // true

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op donderdag 13 september 2007 @ 08:55:
[...]
Wat ik uiteindelijk wil is dat de copy contructor van String niet gebruikt wordt. De toepassing is er niet (of voor de azijnpissers onder ons: nauwelijks).

String is een vreemde eend in de bijt binnen Java. Tenminste op het eerste gezicht:
Java:
1
2
3
4
5
6
7
8
9
String a = "foo";
String b = "foo";
String c = new String("foo");
String d = new String(a);
String e = d.intern();
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a == d); // false
System.out.println(a == e); // true
Misschien handig om erbij te vermelden dan dat dit als gevolg is van string interning, tbv o.a. geheugen besparing.

Zojuist onder de douche echter zet ik toch kanttekeningen bij geheugenbesparing, i.e. hoeft niet per definitie op te gaan: het kan evengoed mis gaan in de verkeerde handen (maar dat gaat geldt voor meer dingen zo).

De intern methode voegt namelijk een string toe aan de z.g.n. unique string pool van String. Indien de aangeboden string zich al in deze pool bevindt wordt een kopie van de referentie gereturned naar die string die zich al bevindt in de pool met dezelfde inhoud als de aangeboden string. Pas wanneer dit niet het geval is, i.e. de aangeboden string zich niet bevindt in de pool, wordt deze toegevoegd aan de pool en een kopie van de referentie ernaar gereturned.

De oplettende lezer ziet dan dat het argument van geheugen besparing eventueel niet opgaat doordat er continu nieuwe strings aangeboden kunnen worden aan de pool, die als gevolg daarvan zal groeien. Aangezien de documentatie geen uitlatingen doet over de maximale grootte van deze pool en zijn etiquette, kunnen we ervan uit gaan dat we hier 'oneindig' (tenminste in hoeverre onze toegekende geheugen het toestaat) mee door kunnen gaan. Gevolg is dat alle strings in deze pool, zolang ze zich in deze pool bevinden (en daar wordt dus geen uitlating over gedaan door de documentatie), minstens een referentie hebben en niet in aanmerking komen voor garbage collection: ze blijven dus in geheugen gedurende de levensloop van het programma, tenminste, ik ben me van geen optimalisatie hiervoor op de hoogte. Moraal van het verhaal: wees oplettend bij zelf interning toepassen.

[ Voor 52% gewijzigd door prototype op 13-09-2007 09:21 . Reden: Even reden erbij gezet ;) ]

Pagina: 1