KeyListener,MouseListener,MouseMotionListener und static

J@ckWhiteIII

Mitglied
Hallo,
ich hab mal eine Frage: Und zwar habe ich im folgendem Code das Problem, dass ich, wenn ich von einer Klasse mit den drei Oben genannten Interfaces auf public Variablen in einer anderen Klasse zugreifen will, ich diese immer static setzen muss. Das führt jedoch meistens zu irgendwelchen anderen Problemen. Darum meine Frage: Warum muss dabei alles static?
Hier der Code:
Java:
import javax.swing.*;

public class JumpnRun extends JApplet {
	
	private static final long serialVersionUID = 1L;
	public Screen screen; //müsste static, sonst kann ich von der Mouse Klasse nicht darauf zugreifen
	
	public void init(){
		screen = new Screen(this);
		add(screen);
	}
	
	public void start(){
		screen.running = true;
	}
	
	public void stop(){
		screen.running = false;
	}

}

Java:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Screen extends JPanel implements ActionListener,Runnable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public int x,y;
	public Thread t = new Thread(this);
	public Character c = new Character(40,40,32,32);
	public boolean running = true;
	
	public Screen(JumpnRun frame){
		x = frame.getSize().width;
		y = frame.getSize().height;
		t.start();
		this.addMouseListener(new Mouse());
		this.addMouseMotionListener(new Mouse());
		this.addKeyListener(new Mouse());
	}

	public void actionPerformed(ActionEvent e) {
		
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.fillRect(0, 0, x, y);
		c.draw(g);
	}

	public void run() {
		while(true){
			if(running){
				repaint();
			}else{
				
			}
		}
	}

}

Java:
import java.awt.event.*;

public class Mouse implements MouseListener,MouseMotionListener,KeyListener{

	public void mouseDragged(MouseEvent e) {
		
	}

	public void mouseMoved(MouseEvent e) { //hier drin wollte ich auf screen in Klasse JumpnRun zugreifen..
		e.getX(); 
		e.getY();
	}

	public void mouseClicked(MouseEvent e) {
		
	}

	public void mouseEntered(MouseEvent e) {
		
	}

	public void mouseExited(MouseEvent e) {
		
	}

	public void mousePressed(MouseEvent e) {
		
	}

	public void mouseReleased(MouseEvent e) {
		
	}

	public void keyPressed(KeyEvent e) {
		
	}

	public void keyReleased(KeyEvent e) {
		
	}

	public void keyTyped(KeyEvent e) {
		
	}

}

Java:
import java.awt.*;
import javax.swing.*;

public class Character extends Rectangle {

	private static final long serialVersionUID = 1L;
	private Image img = new ImageIcon("C://Users//Marius//Pictures/Character1.png").getImage();
	
	public Character(int x, int y, int width,int height){
		setBounds(x,y,width,height);
	}
	
	public void draw(Graphics g){
		g.drawImage(img, x, y, width,height,null);
	}

}

Wäre nett, wenn jemand dazu eine Erklärung geben könnte. Dankeschön.
 

pl4gu33

Top Contributor
naja weil du immer nen Objekt der Klasse brauchst wenn du die "public" Variablen benutzen willst.
Wenn du direkt drauf zugreifen willst musst du diese als Static- Variablen machen. Übrigens sind public- Attribute keine schöne Lösung! :)
 

J@ckWhiteIII

Mitglied
Wenn es in der falschen Klasse ist, frage ich mich jedoch, wo es sonst hinein soll, wenn nicht in die Hauptklasse.

Es wäre generell mal ganz schön, wenn auf diesem Forum z.B. ein Tutorial dafür gemacht würde, welches sich damit beschäftigt, wie man "sauberen" Code schreibt (habe bisher keins gefunden). Denn wenn man der OOP neu ist und auch nicht gerade studiert, ist es ziemlich schwer "Do's" und "Don't's" zu finden. Man sieht nämlich öfters auf diesem Forum, dass die Strukturierung vom Code des Threaderstellers kritisiert wird ("Dein Code ist ein völliges Chaos.", "was soll den der ganze static scheis"). Da es im AWT/Swing-Bereich dieses Forums ja eine Anleitung für's Zeichnen gibt, wäre es doch ganz schön, wenn es im Anfängerteil eine Strukturanleitung mit Regeln geben würde?
Musste einfach mal gesagt werden. Denn so wie es jetzt ist, sind Nichtstudierte verloren. Schade eigentlich, wo es doch ein schönes Forum ist.

Ist nicht böse gemeint, die Kritik, aber es scheint ja keiner selbst auf die Idee zu kommen.
 

Timothy Truckle

Top Contributor
Wenn es in der falschen Klasse ist, frage ich mich jedoch, wo es sonst hinein soll, wenn nicht in die Hauptklasse.
Die simple Antwort ist: Felder gehören immer in die Klasse, in der sie benutz werden, und es sollte immer nur eine Klasse geben, die ein Feld benutzt.

Und die Klasse mit der
Code:
main
Methode ist nicht zwangsläufig die Hauptklasse.

Es wäre generell mal ganz schön, wenn auf diesem Forum z.B. ein Tutorial dafür gemacht würde, welches sich damit beschäftigt,
Zu dem Thema gibt es genug Bücher. Wir wollen deren Autoren ja nicht verhungern lassen... ;o)

bye
TT
 

Kevin94

Top Contributor
Dein einziges Problem ist eingentlich, dass du die Listener in eine eigene Klasse auslagerst. Um dann an die Screen-Instanz zu kommen müsstest du die Variable im Konstruktor von Mouse übergeben und in einer eigenen Instanzvariable (quasi nochmal) speichern. Das wäre zumindestens aus OOP-Sicht bei dieser Klassenaufteilung die beste Lösung.
Um diesen ganzen Zirkus zu vermeiden, ist es gängige Praxis, Listener als Anonyme/Innere Klassen zu implementieren, da dann diese Referenz implizit vorhanden ist (über Screen.this). Das wird vom Compiler zwar genauso umgesetzt, wie wenn man es selber in einer eigenständigen Klasse programmieren würde (über eine private Variable mit Namen this$0), aber der Code ist wesentlich leserlicher.
 

J@ckWhiteIII

Mitglied
Soooooooo ich habe die Klasse Mouse gelöscht und Screen zum Folgenden verändert:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Screen extends JPanel implements Runnable {
	
	private static final long serialVersionUID = 1L;
	public int x,y;
	public Thread t = new Thread(this);
	public CCharacter c = new CCharacter(40,40,32,32);
	public boolean running = true;
	
	public Screen(JumpnRun frame){
		x = frame.getSize().width;
		y = frame.getSize().height;
		t.start();
		frame.addMouseListener(new MouseAdapter(){
			
		});
		frame.addMouseMotionListener(new MouseMotionAdapter(){
			
		});
		frame.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				switch(e.getKeyCode()){
				case KeyEvent.VK_SPACE:           //springen
					if(!c.jumping){
						c.jumping = true;
					}
					break;
				case KeyEvent.VK_DOWN:          //ducken
					c.y += 2;
					break;
				case KeyEvent.VK_LEFT:
					c.x -= 2;
					break;
				case KeyEvent.VK_RIGHT:
					c.x += 2;
					break;
				}
			}
		});
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.fillRect(0, 0, x, y);
		c.draw(g);
	}

	public void run() {
		while(true){
			if(running){
				c.jump(c.jumping);
				repaint();
			}else{
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

Allerdings wird c.jumping noch nicht true, d.h. ich werde daran noch arbeiten müssen. Der CCharacter lässt sich jedoch bewegen, was sehr gut ist. Vielen Dank an den letzten Post, da dieser mich von einer (schlechten) Angewohnheit abgebracht hat.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
M KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
M Mit KeyListener Farbe von Label ändern Java Basics - Anfänger-Themen 13
N Java Keylistener Java Basics - Anfänger-Themen 2
B KeyListener funkioniert nicht Java Basics - Anfänger-Themen 2
F KeyListener Java Basics - Anfänger-Themen 3
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
J-Gallus Keylistener verstehen Java Basics - Anfänger-Themen 17
S Keylistener Java Basics - Anfänger-Themen 16
S Keylistener im Grafikfenster Java Basics - Anfänger-Themen 3
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
N KeyListener in Thread Java Basics - Anfänger-Themen 0
LexeB4F for schliefe in KeyListener Java Basics - Anfänger-Themen 3
R KeyListener auslagern Java Basics - Anfänger-Themen 3
J KeyListener aus anderer Klasse bereitet Probleme Java Basics - Anfänger-Themen 1
Z KeyListener funktioniert nicht? Weshalb? Java Basics - Anfänger-Themen 8
T KeyListener Java Basics - Anfänger-Themen 2
Gfreak23 Input/Output KeyListener funktioniert auf Laptop nicht allerdings auf Tower-PC Java Basics - Anfänger-Themen 8
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
TheSorm KeyListener Problem Java Basics - Anfänger-Themen 4
M KeyListener Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
D KeyListener nicht mehr aktiv nach ActionPerformed Java Basics - Anfänger-Themen 2
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
L Input/Output Java 3D mit KeyListener Java Basics - Anfänger-Themen 1
S KeyListener reagiert nicht. Java Basics - Anfänger-Themen 4
L KeyListener ohne textfeld Java Basics - Anfänger-Themen 4
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
B KeyListener als allgemeine Methode Java Basics - Anfänger-Themen 5
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
0 KeyListener ausserhalb der Applikation Java Basics - Anfänger-Themen 5
G KeyListener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
J KeyListener funtioniert nicht! Java Basics - Anfänger-Themen 3
J KeyListener Java Basics - Anfänger-Themen 11
P Input/Output KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
G KeyListener, Fokus Java Basics - Anfänger-Themen 8
K Input/Output KeyListener funktioniert nicht Java Basics - Anfänger-Themen 3
A Input/Output Keylistener Aktiv schalten Java Basics - Anfänger-Themen 8
J keyListener - Genau 1 Aktion soll bei 1 Tastenausdruck ausgeführt werden Java Basics - Anfänger-Themen 11
S KeyListener Java Basics - Anfänger-Themen 2
A Erste Schritte Problem mit KeyListener Java Basics - Anfänger-Themen 6
Maxim6394 KeyListener geht nicht Java Basics - Anfänger-Themen 15
A Wie KeyListener adden? Java Basics - Anfänger-Themen 15
Maxim6394 KeyListener funktioniert nicht Java Basics - Anfänger-Themen 20
U KeyListener StackOverflowError Java Basics - Anfänger-Themen 2
W KeyListener auf Applet mit Runnable Java Basics - Anfänger-Themen 4
M Apfel-Spiel KeyListener Java Basics - Anfänger-Themen 33
J KeyListener (keyTyped) funktioniert nicht Java Basics - Anfänger-Themen 9
Luk10 KeyListener Java Basics - Anfänger-Themen 13
S KeyListener aus anderer Klasse hinzufügen Java Basics - Anfänger-Themen 19
P KeyListener im Applet Java Basics - Anfänger-Themen 2
S KeyListener-Anwendung Java Basics - Anfänger-Themen 7
O KeyListener funktioniert nur wenn er will Java Basics - Anfänger-Themen 2
A KeyListener funzt ned Java Basics - Anfänger-Themen 6
D KeyListener, Unterscheidung Groß/Kleinbuchstaben Java Basics - Anfänger-Themen 3
S KeyListener als class? Java Basics - Anfänger-Themen 4
F Applet mit KeyListener, "Alt"-Taste und Konflikt mit Browser Java Basics - Anfänger-Themen 2
P KeyListener Java Basics - Anfänger-Themen 2
S KeyListener für einfaches Programm Java Basics - Anfänger-Themen 3
S KeyListener aktiv auch wenn minimiert? Java Basics - Anfänger-Themen 4
Z Globaler Keylistener Java Basics - Anfänger-Themen 2
V KeyListener Beispiel Java Basics - Anfänger-Themen 13
T canvas killt KeyListener Java Basics - Anfänger-Themen 2
Das Brot Nach .add(JRadioButton) funktioniert der KeyListener nicht mehr Java Basics - Anfänger-Themen 2
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
D KeyListener, nichts passiert Java Basics - Anfänger-Themen 6
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
D Keylistener zu langsam Java Basics - Anfänger-Themen 7
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2
G Keylistener in einer Schleife Java Basics - Anfänger-Themen 9
M problem mit keylistener Java Basics - Anfänger-Themen 2
M TabbedPane: KeyListener funktioniert nicht mehr Java Basics - Anfänger-Themen 8
N KeyListener ohne GUI? Java Basics - Anfänger-Themen 5
M KeyListener Java Basics - Anfänger-Themen 3
T KeyListener wird nicht ausgelöst Java Basics - Anfänger-Themen 6
O KeyListener Java Basics - Anfänger-Themen 8
Developer_X KeyListener ohne JFrame Java Basics - Anfänger-Themen 13
H KeyListener Java Basics - Anfänger-Themen 4
Developer_X KeyListener Actions (hat mit Java3D zu tun) Java Basics - Anfänger-Themen 20
H KeyListener funktioniert nicht Java Basics - Anfänger-Themen 8
Developer_X JFrame soll KeyListener adden Java Basics - Anfänger-Themen 32
F Keylistener Java Basics - Anfänger-Themen 12
hdi KeyListener : keyTyped() nicht nutzbar? Java Basics - Anfänger-Themen 1
StickToFreak Runnable + KeyListener? Java Basics - Anfänger-Themen 32
dl85hej Keylistener Java Basics - Anfänger-Themen 16
H KeyListener will nicht reagieren Java Basics - Anfänger-Themen 5
R Fehlersuche - KeyListener, KeyAdaper - Nichts Klappt! Java Basics - Anfänger-Themen 2
G Prob. mit KeyListener und Unterklasse Java Basics - Anfänger-Themen 5
G Keylistener nur besimmte Zeichen zulassen Java Basics - Anfänger-Themen 8
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
A KeyListener funktioniert nicht Java Basics - Anfänger-Themen 7
D KeyListener Java Basics - Anfänger-Themen 7
B Keylistener auf JSpinner reagiert nicht? Java Basics - Anfänger-Themen 3
G KeyListener für die Taste "/" Java Basics - Anfänger-Themen 5
E brauche hilfe beim KeyListener Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben