Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 17:19

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Eine sich ändernde Variable holen

Discussion on Eine sich ändernde Variable holen within the Java forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Question Eine sich ändernde Variable holen

Nabend Dudes,

ich habe einen KeyListener für ein jTextField in der Klasse Game und möchte nun immer das aktuelle Wort, was gerade angezeigt wird, bei einem KeyRelease ausgeben. Um es mal simpel zu veranschaulichen (unwichtigen Code gelöscht):

Game.java:
Code:
public class Game extends JPanel{
    public String str = "boo";

    public void paintComponent(Graphics g) {

        if (xPos >= this.getWidth()) {
                str = declareWord();  // Setzt ein zufälliges Wort (!= "boo")
        }

    }
}
KeyEventListener.java:
Code:
public class KeyEventListener implements KeyListener {
    Game test = new Game();
    String word;

    public void keyReleased(KeyEvent e) {
        getKey(e);
    }

    private void getKey(KeyEvent released) {
        word = test.str;  // Bestimmt nicht die beste Lösung (Ist ja auch falsch)
        System.out.println(word);
    }
}
Mein Problem ist jetzt, dass egal wann ich eine Taste drücke (bzw. loslasse), mir immer nur "boo" ausgegeben wird. Also nicht das aktuelle Wort, was in der Paint-Komponente schon längst geändert wurde. Kann auch sein, dass es da eine ziemlich triviale Lösung zu gibt. Nur leider bin ich noch nicht drauf gekommen. Würde mich über einen kleinen Denkantoß freuen.
exceble is offline  
Old 06/21/2016, 16:12   #2
 
elite*gold: 0
Join Date: Jul 2009
Posts: 211
Received Thanks: 137
Aus dem Beispiel werden einige Dinge nicht ganz klar.

Die paintComponent wird unteranderem dann aufgerufen, wenn:
  1. Die GUI initialisiert UND angezeigt wird
  2. ein update der Oberfläche aufgerufen wird
  3. die parent Komponente aktuallisiert wird
  4. Bei bestimmten events (resize usw.)

Wenn du aber jedesmal new Game().str aufrufst wird jedes mal ein neues Game-Object erzeugt. Bei dem erzeugen Object wird die paintComponent aber niemals aufgerufen also wird der String auch nicht gesetzt.
Mysthik is offline  
Old 06/21/2016, 16:23   #3
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by Mysthik View Post
Aus dem Beispiel werden einige Dinge nicht ganz klar.

Die paintComponent wird unteranderem dann aufgerufen, wenn:
  1. Die GUI initialisiert UND angezeigt wird
  2. ein update der Oberfläche aufgerufen wird
  3. die parent Komponente aktuallisiert wird
  4. Bei bestimmten events (resize usw.)

Wenn du aber jedesmal new Game().str aufrufst wird jedes mal ein neues Game-Object erzeugt. Bei dem erzeugen Object wird die paintComponent aber niemals aufgerufen also wird der String auch nicht gesetzt.
Die paintComponent wird aufgerufen und macht das was es soll, das ist garnicht das Problem. Ja auch wenn ich vorher ein Game-Objekt erstelle, macht das kein Unterschied, ich kriege weiterhin nur "boo" zurück. Ich will nur die aktuelle Variabel str, welche in der paintComponent geändert wird, aus der Game-Klasse kriegen. Aber er gibt mir die ganze Zeit str aus der Deklaration. Also "boo".

Zur Erläuterung: declareWord() ist eine Methode, die ein String zurück liefert, welcher vorher zufällig aus einer Liste gewählt wurde, welche nicht "boo"enthält.
exceble is offline  
Old 06/21/2016, 18:25   #4
 
.Scy's Avatar
 
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
also was ist das ziel? du möchtest wenn der benutzer in dem TextField fertig getippt hat was auch immer dadrinnen steht auswerten?

bei keyReleased bekommst du nach jedem einzelnen char schon ne rückmeldung, eher suboptimal mMn, kann man aber mit arbeiten.

zeig uns doch erstmal deinen Konstruktor von Game.

Zudem musst du um dein ziel zu erreichen nichts weiter als den konstruktor von Game anpassen, du brauchst die paintComponent nicht Overriden(was in deinem stück code auch fehlt).
.Scy is offline  
Thanks
1 User
Old 06/21/2016, 21:14   #5
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by .Scy View Post
(was in deinem stück code auch fehlt).
Quote:
Originally Posted by exceble View Post
Um es mal simpel zu veranschaulichen (unwichtigen Code gelöscht)
Ich habe alles nötige oben angegeben. Ich versuch mich jetzt nochmal klar auszudrücken. Die String-Variabel str wird ständig geändert. Wenn ich vom KeyListener die Variabel holen will, bekomme ich aber nur "boo" zurück, wie ich str auch in der Game-Klasse initalisiert habe. Es hat absolut nichts mit der TextBox zu tun oder ob es jetzt nur released oder pressed ist. Es geht lediglich darum, dass sich die Variabel ändert und ich per Tastendruck (völlig irrelevant - aber dann wird der Code aufgerufen) mir die aktuelle Variabel str holen möchte.
exceble is offline  
Old 06/21/2016, 23:23   #6
 
.Scy's Avatar
 
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
wie schon gesagt, ist dein painComponent Schwachsinn. zu der zeit wo du das ding initialisierst hat es keine Größe. die Größe bekommt es erst vom frame, sobald es visible ist, dann zeichnest du zwar, aber nur ein mal und danach nie wieder außer du erzwingst einen repaint, was du in dem gezeigten code nicht tust. Zudem hast du eine Bedingung drinnen, welche man mit dem code nichtmal nachvollziehen kann.

natürlich falsch:
Code:
public class KeyEventListener implements KeyListener {
    String word;

    public void keyReleased(KeyEvent e) {
        getKey(e);
    }

    private void getKey(KeyEvent released) {
        word = new Game().str;
        System.out.println(word);
    }
}
Code:
public static void main(){
    Game test = new Game();
//Irgend ein frame aufbauen
//Mit deinem textfeld
textfeld.addKeyListener(new KeyListener() {
			String word;
		  @ Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		  @ Override
			public void keyReleased(KeyEvent e) {
				getKey(e);
				
			}
			
		  @ Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
                        private void getKey(KeyEvent released) {
        word = test.str; 
        System.out.println(word);
    }
		});

}
du kannst nicht einfach beliebig häufig new Game().str rufen. du hast deinem Str fest den wert "boo" gegeben und du rufst eben kein paintComponent auf, da du ja nichtmal weißt, wann java es für nötig hält paintComponent aufzurufen. zudem finde ich es mehr als suboptimal abhängig von einer position ein wort auszuwählen.
.Scy is offline  
Thanks
1 User
Old 06/21/2016, 23:42   #7
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by .Scy View Post
wie schon gesagt, ist dein painComponent Schwachsinn. zu der zeit wo du das ding initialisierst hat es keine Größe. die Größe bekommt es erst vom frame, sobald es visible ist, dann zeichnest du zwar, aber nur ein mal und danach nie wieder außer du erzwingst einen repaint, was du in dem gezeigten code nicht tust. Zudem hast du eine Bedingung drinnen, welche man mit dem code nichtmal nachvollziehen kann.

natürlich falsch:
Code:
public class KeyEventListener implements KeyListener {
    String word;

    public void keyReleased(KeyEvent e) {
        getKey(e);
    }

    private void getKey(KeyEvent released) {
        word = new Game().str;
        System.out.println(word);
    }
}
Code:
public static void main(){
    Game test = new Game();
//Irgend ein frame aufbauen
//Mit deinem textfeld
textfeld.addKeyListener(new KeyListener() {
			String word;
		  @ Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		  @ Override
			public void keyReleased(KeyEvent e) {
				getKey(e);
				
			}
			
		  @ Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
                        private void getKey(KeyEvent released) {
        word = test.str; 
        System.out.println(word);
    }
		});

}
du kannst nicht einfach beliebig häufig new Game().str rufen. du hast deinem Str fest den wert "boo" gegeben und du rufst eben kein paintComponent auf, da du ja nichtmal weißt, wann java es für nötig hält paintComponent aufzurufen. zudem finde ich es mehr als suboptimal abhängig von einer position ein wort auszuwählen.
Quote:
Originally Posted by exceble View Post
Ja auch wenn ich vorher ein Game-Objekt erstelle, macht das kein Unterschied
Und wie auch bereits zwei mal erwähnt, habe ich unnötigen Code entfernt. Ich bin dir zwar dankbar, aber bitte lies dir doch alle Beiträge durch bevor du mir helfen möchtest.

Edit: Hab's mal geändert
exceble is offline  
Old 06/22/2016, 09:14   #8
 
.Scy's Avatar
 
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
du verstehst deinen code ja nichtmal, du erzeugst dir in deinem listener, was total schwachsinnig ist und was ich auch nicht gezeigt habe, weiterhin ein Game Objekt. Dieses zeichnet sich NIE! du hast es zwar, aber es liegt auf keinem frame.

bevor du hier weiter machst solltest du dir erstmal swing beibringen. du wirst immer boo heraus bekommen wenn du dein jpanel nicht in ein frame, welches visible ist, legst.

ich weiß nicht wo du dein frame erzeugst, aber dort MUSST du dein Game erzeugen UND Game deinem frame hinzufügen. so wie du es im moment zeigst ruft sich paintComponent nie auf, weil JPanel sich nur malt, wenn es vom frame dazu den Aufruf bekommt, oder du eben game.PaintComponent aufrufst, aber da du keinen gültigen Graphics hast wird das nicht klappen.
.Scy is offline  
Thanks
1 User
Old 06/22/2016, 09:27   #9
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by .Scy View Post
du verstehst deinen code ja nichtmal, du erzeugst dir in deinem listener, was total schwachsinnig ist und was ich auch nicht gezeigt habe, weiterhin ein Game Objekt. Dieses zeichnet sich NIE! du hast es zwar, aber es liegt auf keinem frame.

bevor du hier weiter machst solltest du dir erstmal swing beibringen. du wirst immer boo heraus bekommen wenn du dein jpanel nicht in ein frame, welches visible ist, legst.

ich weiß nicht wo du dein frame erzeugst, aber dort MUSST du dein Game erzeugen UND Game deinem frame hinzufügen. so wie du es im moment zeigst ruft sich paintComponent nie auf, weil JPanel sich nur malt, wenn es vom frame dazu den Aufruf bekommt, oder du eben game.PaintComponent aufrufst, aber da du keinen gültigen Graphics hast wird das nicht klappen.
Okay, tut mir Leid. Hatte versucht es so einfach wie möglich darzustellen, aber anscheinend greift das nur mehr Probleme auf. Den Listener habe ich erstellt, weil es mir so gesagt wurde. Dort wird noch einiger Code hinzukommen, weswegen ich den outsourcen sollte.

Hier mal den kompletten Quellcode:



Habe in deinem Vorschlag übersehen, dass du das Game-Objekt in der Main-Methode erstellst. Meine Main-Methode ruft die startGame()-Methode der Game-Klasse auf. Ich weiß nicht so ganz, wie ich das jetzt umsetzen soll.
exceble is offline  
Old 06/22/2016, 09:59   #10
 
.Scy's Avatar
 
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
das erste problem ist, dass du bei startGame
Code:
game.add(new Game());
machst, dadurch hast du zwar ein game Objekt aber darauf hast du keinen zugriff, weil es anonym ist.
Code:
Game something = new Game();
game.add(something);

//viel zeug
//keylistener hinzufügen
jf.addKeyListener(new KeyListener(){
			String word;
		  @ Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		  @ Override
			public void keyReleased(KeyEvent e) {
				getKey(e);
				
			}
			
		  @ Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
                        private void getKey(KeyEvent released) {
        word = something.str; 
        System.out.println(word);
    }
		});
den keyListener wirst du nicht auf diese weise häufiger verwenden, also baut man sich einen anonymen keyListener, in diesem kannst du dann auf something zugreifen.

listener würde man so oder so entweder als innere class oder direkt als anonyme class bauen, damit sie eben zugriff auf alles in der klasse haben. dein problem mit der extra class für den KeyListener ist, dass du dein Objekt von Game public setzen musst, dies kann man durch innere oder anonyme klassen umgehen.

du hast genau 1 Game-Objekt welches gezeichnet wird, dies liegt in deiner startGame, deswegen musst du auch auf das Objekt zugreifen und kein neues erstellen, weil die anderen nicht gezeichnet werden. hoffe soweit verständlich
.Scy is offline  
Thanks
1 User
Old 06/22/2016, 10:07   #11
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by .Scy View Post
das erste problem ist, dass du bei startGame
Code:
game.add(new Game());
machst, dadurch hast du zwar ein game Objekt aber darauf hast du keinen zugriff, weil es anonym ist.

den keyListener wirst du nicht auf diese weise häufiger verwenden, also baut man sich einen anonymen keyListener, in diesem kannst du dann auf something zugreifen.

listener würde man so oder so entweder als innere class oder direkt als anonyme class bauen, damit sie eben zugriff auf alles in der klasse haben. dein problem mit der extra class für den KeyListener ist, dass du dein Objekt von Game public setzen musst, dies kann man durch innere oder anonyme klassen umgehen.

du hast genau 1 Game-Objekt welches gezeichnet wird, dies liegt in deiner startGame, deswegen musst du auch auf das Objekt zugreifen und kein neues erstellen, weil die anderen nicht gezeichnet werden. hoffe soweit verständlich
Wunderbar, Problem gelöst. Ich danke dir vielmals für deine Hilfe und vorallem deine Geduld! Leider habe ich grad kein e*gold rumfliegen, um meine Dankbarkeit auszudrücken. :P

Cheers
exceble is offline  
Old 06/23/2016, 10:57   #12
dotCom
 
Devsome's Avatar
 
elite*gold: 9842
The Black Market: 107/0/0
Join Date: Mar 2009
Posts: 16,843
Received Thanks: 4,675
#closed on request
problem solved
Devsome is offline  
Closed Thread


Similar Threads Similar Threads
[PHP]Überprüfen ob eine Variable zugewiesen wurde
09/06/2014 - Web Development - 4 Replies
Hey, ich habe eine Variable gestzt und möchte jetzt prüfen ob da irgend ein Text oder so drin ist. Also: $name; Wie kann ich jetzt überprüfen ob da irgendwas gesetzt ist? Habe gegooglet jedoch nix gefunden wie ich es meine.
Wie kann ich eine Variable senden?
01/21/2014 - AutoIt - 5 Replies
Also... ich möchte eine Variable senden. Bisher habe ich dass so versucht: IP$ = Input1 + 1 Send ($IP) // Send ("{" & $IP & "}") Das hat allerdings beides nicht funktioniert... (Ich hab das mit anderen, funkionierenden Befehlen unter "Case $Button1" geschrieben.)
Lohnt es sich eine PSVita zu holen oder doch N3DS
05/01/2013 - Consoles - 15 Replies
Hey Leute, ich spiele seit einer geringen Zeit mit dem Gedanken mir eine PSVita zuzulegen, aber es gab ja einen extremen Shitstorm gegenüber Sony wegen der PSVita. Ich will mir unbedingt ein Handheld holen kann mich aber nicht zwischen einer PSVita oder einem Nintendo 3DS entscheiden. Von dem Design der Konsole an sich finde ich die PSVita um längen schöne, und auch das "Stift" System gefälllt mir nicht so ganz. Wiederrum gibt es nur wenig gute Spiele für die Vita und der 3DS springt da...
Sich ändernde Graffitis CSS
04/06/2013 - Counter-Strike - 5 Replies
Hab heute in CSS gesehen das sich ein Graffiti je nach Blickwinkel und Reichweite verändert hat, hat jemand ne Ahnung wo ich so eins herbekomme? http://steamcommunity.com/sharedfiles/filedetails /?id=136970976 Steam Community :: Screenshot Steam Community :: Screenshot Steam Community :: Screenshot Wäre nett wenn ihr mir helfen könntet, vielleicht sogar genau das selbe Graffiti :D
Überprüfen ob Variable Eine Variable ist
10/16/2010 - AutoIt - 26 Replies
Hey leute ich wollte fragen ob/wie man überprüfen kann ob eine Variable eine Variable ist z.b. so $k = 1 $i = $k if $i = VARIABLE Then msgbox(0,'$i ist eine variable!!','') endif PS:Wp releast man nochma TuT (z.b. für metin2??)



All times are GMT +1. The time now is 17:20.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.