Klassenübergreifender Befehl geht nicht

DannyDaniel

Mitglied
Hallo Java-Community!
Ich habe zwei Klassen: Oberfläche und Steuerung. Von der Klasse Steuerung aus möchte ich mit dem KeyListener die Hintergrundfarbe des Frames ändern. Leider funktioniert dies nicht und ich verstehe nicht weshalb.
Vielen Dank im Voraus!

Hier mein Quellcode der Oberfläche:
Java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
public class Oberflaeche {
  JFrame frame;
  Steuerung steuerung;     
  public void los() {
    steuerung = new Steuerung();
   
    frame = new JFrame();
    frame.setSize(500, 500);
    frame.setVisible(true);        
    frame.setLocationRelativeTo(null);   
    frame.addKeyListener(steuerung);    
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
  }
 
  public static void main(String[] args) {
    Oberflaeche meineUI = new Oberflaeche();
    meineUI.los(); 
  }
}

Hier mein Quellcode der Steuerung:
Java:
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;    
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.*;
import java.awt.event.*;  
import java.awt.Color;
public class Steuerung implements KeyListener{
  Oberflaeche meineUI = new Oberflaeche();
 
  public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_SPACE){
      meineUI.frame.getContentPane().setBackground(Color.cyan);
    }
  }
  public void keyTyped(KeyEvent e) {
   
  }
  public void keyReleased(KeyEvent e) {
   
  }  
}
 

Joose

Top Contributor
Du erstellst in deiner Klasse Steuerung ein komplett neues Objekt der Klasse Oberflaeche.
Von diesem neuen Objekt änderst du dann die Farbe, das was aber angezeigt wird bleibt unberührt.

Lösungsvorschlag: Dein Steuerung Objekt braucht einen Verweis auf dein Oberflaeche Objekt. Diese könntest du an Steuerung im Konstruktor übergeben.
 

Jardcore

Top Contributor
Ich glaube er meint das so ähnlich:
Java:
public class Oberflaeche {

  private JFrame frame;
  private Steuerung steuerung;

  public void los() {
    steuerung = new Steuerung(this);

    frame = new JFrame();
    frame.setSize(500, 500);
    frame.setVisible(true);   
    frame.setLocationRelativeTo(null);
    frame.addKeyListener(steuerung);
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
  }

  public static void main(String[] args) {
    Oberflaeche meineUI = new Oberflaeche();
    meineUI.los();
  }
}

Java:
public class Steuerung implements KeyListener{

  private Oberflaeche meineUI;

  public Steuerung(Oberflaeche oberflaeche) {
    meineUI = oberflaeche;
  }

  public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_SPACE){
      meineUI.frame.getContentPane().setBackground(Color.cyan);
    }
  }
  public void keyTyped(KeyEvent e) {

  }
  public void keyReleased(KeyEvent e) {

  }
}
 
Zuletzt bearbeitet:

uppss

Aktives Mitglied
@Jardcore Das funktioniert leider nicht. Der Frame-Hintergrund ändert sich immer noch nicht.
was gena funktioniert nicht?

public class Oberflaeche {

private JFrame frame;
private Steuerung steuerung;

public void los() {
steuerung = new Steuerung(this);

frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.addKeyListener(steuerung);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
Oberflaeche meineUI = new Oberflaeche();
meineUI.los();
}
}
public class Steuerung implements KeyListener{

private Oberflaeche meineUI;

public Steuerung(Oberflaeche oberflaeche) {
meineUI = oberflaeche;
}


public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE){
meineUI.frame.getContentPane().setBackground(Color.cyan);
}
}
public void keyTyped(KeyEvent e) {

}
public void keyReleased(KeyEvent e) {

}
}
 

Neumi5694

Top Contributor
Dein Keylistener wird nie angesprochen (Da hätte noch eine Debug-Ausgabe reingepasst, wenn du schon nicht durchsteppen willst).
Ich bin jetzt nicht sicher, ob ein Frame oder ein Panel überhaupt einen funktionierenden Keylistener haben können (hat beim Test auch nicht für die ContentPane funktioniert). das Panel zumindest hat ja nie den Fokus für die Eingabe, wahrscheinlich auch nicht das Frame.

Registriere stattdessen eine Aktion für die gewünschte Taste


Probier einen Actionlistener auf diese Art zuzuweisen:
Java:
public class Oberflaeche {
  private JFrame frame;
  private Steuerung steuerung;
  public void los() {
    steuerung = new Steuerung(this);

    frame = new JFrame();
    frame.setSize(500, 500);
    frame.setVisible(true); 
    frame.setLocationRelativeTo(null);
    frame.getRootPane().registerKeyboardAction(
                steuerung,
                KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
  }
  public static void main(String[] args) {
    Oberflaeche meineUI = new Oberflaeche();
    meineUI.los();
  }
} 
public class Steuerung implements ActionListener{

  private Oberflaeche meineUI;

  public Steuerung(Oberflaeche oberflaeche) {
    meineUI = oberflaeche;
  }

        @Override
        public void actionPerformed(ActionEvent e) {
            meineUI.frame.getContentPane().setBackground(Color.cyan);
        }

}




btw, du musst dem Listener gar keine Oberflaeche zuweisen, die kriegst du auch über e.getSource() raus.

Für diesen einfachen Anwendungsfall würde ich den ActionListener ohne Oberflaeche-Konstruktor erzeugen und mir das Objekt auf diese Art holen:

Java:
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e != null && e.getSource() instanceof JRootPane) {
                ((JRootPane)e.getSource()).getContentPane().setBackground(Color.cyan);
            }
        }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
J CMD Befehl in Java Consolenprogramm ausführen Allgemeine Java-Themen 6
T Konsolen-Befehl junk Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
F Create Befehl mit variierender Spaltenanzahl/Spaltenname Allgemeine Java-Themen 5
E String in Zahl umwandeln, ohne Befehl Integer.parseInt Allgemeine Java-Themen 3
T DLL Befehl Funktionsparameter Allgemeine Java-Themen 6
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
B Zeitmessen Befehl sende und empfagen Allgemeine Java-Themen 10
G Befehl funktioniert in Eclipse allerdings nicht in einer Jar-Datei Allgemeine Java-Themen 3
J java zurück befehl Allgemeine Java-Themen 18
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
T Java Programm als Batch Befehl Allgemeine Java-Themen 6
K der Befehl "runas" Allgemeine Java-Themen 13
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4
B UNIX Shell befehl über JavaCode ausführen Allgemeine Java-Themen 19
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
S Shell-Befehl: mail Allgemeine Java-Themen 6
M String in Befehl umwandeln Allgemeine Java-Themen 10
S Überprüfen, ob ein Shell Befehl existiert! Allgemeine Java-Themen 4
G CMD befehl: BAT erstellen, reinschreiben und starten? Allgemeine Java-Themen 12
S Suche Pendant zu einem VB Befehl Allgemeine Java-Themen 2
P SQL Befehl Allgemeine Java-Themen 15
G Befehl an OS X cmd Allgemeine Java-Themen 7
L mit exec() befehl ausführen ( OS X / Linux) Allgemeine Java-Themen 8
T jar mit Befehl zur Vergrößerung des VM-Speichers Allgemeine Java-Themen 11
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
S String als Befehl interpretieren Allgemeine Java-Themen 2
S GetColor? anderer befehl Allgemeine Java-Themen 13
M Methode x mal ausführen auf Befehl Allgemeine Java-Themen 7
L linux befehl aus java programm starten Allgemeine Java-Themen 7
M Unter MacOS einen Befehl auf Konsole ausführen? Allgemeine Java-Themen 6
G JDK Version - exec Befehl Allgemeine Java-Themen 3
M Befehl unter Win98 ausführen? Allgemeine Java-Themen 3
M Befehl aus Anwendung starten Allgemeine Java-Themen 7
C shell befehl mit java ein- und auslesen Allgemeine Java-Themen 2
B befehl "java" wird nicht gefunden Allgemeine Java-Themen 4
HolyFUT Best Practice Wie geht man mit "schlechten" Projekten um? Allgemeine Java-Themen 7
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
F 2 JsonArray vergleichen, geht es auch einfacher ? Allgemeine Java-Themen 3
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
P Erste Schritte HauptFrame geht nicht Allgemeine Java-Themen 7
L Applet Applet zu JavaWebStart migrieren - simples sample geht nicht Allgemeine Java-Themen 2
KeVoZ_ Java Mail senden - geht nicht Allgemeine Java-Themen 4
K API - Wie geht das? Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
M JUnit Serverseitig? Wie geht sowas? Allgemeine Java-Themen 2
G Erste Schritte Aufgabe - Geht das auch schneller ? Allgemeine Java-Themen 7
E JavaFX String-Wert geht "verloren" - ratlos Allgemeine Java-Themen 2
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
H Unicode ausgeben ohne Umwandlung - geht das? Allgemeine Java-Themen 3
F Java Anwendung Remote starten geht nicht Allgemeine Java-Themen 0
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
K print() geht nicht ohne println() Allgemeine Java-Themen 3
V 2D-Grafik BufferdImage aus gif Datei in Jar erzeugen geht nicht. Allgemeine Java-Themen 6
Fl4sh1 Autovervollständigungfenster geht nicht (eclipse) Allgemeine Java-Themen 10
P Absatz im String / Excel / /n geht nicht Allgemeine Java-Themen 2
Z Java geht nicht im Browser Allgemeine Java-Themen 5
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
B Keylistener geht nicht Allgemeine Java-Themen 9
R Wie geht man mit CachedRowSet um Allgemeine Java-Themen 2
I Downloaden einer Datei geht nicht? Allgemeine Java-Themen 16
P Input/Output Ordner löschen --> geht nicht Datei --> Ja Allgemeine Java-Themen 6
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
R Geht das? JRE 1.4 global, 1.6.20 nur für eine Anwendung? Allgemeine Java-Themen 9
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
F externe module. geht das in Java? Allgemeine Java-Themen 3
N Java geht nicht mehr zu löschen Allgemeine Java-Themen 5
M XML-Datei geht bei voller Festplatte verloren Allgemeine Java-Themen 4
DStrohma Daten in JAR speichern geht nicht?? Allgemeine Java-Themen 22
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
B Komplettes Projekt als UML Diagramm mit eUML...geht das? Allgemeine Java-Themen 10
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
C Methodenkopf: Zu was wenns auch ohne geht? Allgemeine Java-Themen 3
A Javakonsolenfenster geht gleich wieder zu Allgemeine Java-Themen 6
M Übergebener String bearbeiten geht nicht. Allgemeine Java-Themen 4
D iText und Table.setTableFitsPage(); geht nicht Allgemeine Java-Themen 12
E Cipher geht mal und mal nicht Allgemeine Java-Themen 3
G Datei löschen nach kopieren geht nicht Allgemeine Java-Themen 5
A Standalone geht - JSP u. Bean nicht Allgemeine Java-Themen 6
D Jar auf Mac starten geht nicht Allgemeine Java-Themen 3
M Klasse Desktop geht nicht mehr (EXCEPTION_ACCESS_VIOLATION) Allgemeine Java-Themen 9
M ireport (Jasper Report) geht nur auf meinen Rechner Allgemeine Java-Themen 3
S Rechner formatiert - nichts geht mehr. Allgemeine Java-Themen 2
S Apache Commons Net geht nicht Allgemeine Java-Themen 5
zilti Wieso geht der StreamReader/Writer nicht? Allgemeine Java-Themen 5
T Geht das vielleicht noch einfacher? Allgemeine Java-Themen 7
M commapi unter vista, geht das? Allgemeine Java-Themen 4
V JavaProgramm von Konsole starten geht nichtmehr Allgemeine Java-Themen 4
V JVM OutofMemory Linux geht, windows nicht Allgemeine Java-Themen 3
Chris_1980 Geht das nicht auch einfacher (Arcanoid Multiball) Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben