Swing Wie bekomme ich den Fokus für einen JPanel

icarus2

Top Contributor
Hi

Nachdem ich mich etwas mit anderen Programmiersprachen beschäftigt habe möchte ich nun wieder einmal ein 2D Spiel in Java programmieren. Ich habe dabei einen JFrame, den ich maximiere. Dieser hat dann by default den Fokus. Zu Beginn wird ein Menu (in einem JPanel, der mit maximaler Grösse auf dem JFrame liegt) angezeigt mit einem Start JButton. Wenn dieser angeklickt wird soll der JPanel "GamePanel" mit maximaler Grösse erscheinen. Dem GamePanel möchte ich nun einen KeyListener hinzufügen, was jedoch nicht so läuft wie ich möchte, da der GamePanel nie den Fokus bekommt.

Da es bereits einiges an Code ist kann ich schlecht den ganzen Code zeigen. Ich kann euch aber ein par Ausschnitte geben. Wenn ihr mehr braucht kann ich das dann gerne nachliefern:

Der Konstruktor der Klasse Main (Main ist von JFrame abgeleitet)
[Java]
private Main() {

container = getContentPane();

showMenu();
initializeMainWindow();

}
[/Java]

und noch zwei Methoden aus der Klasse Main:
[Java]
public void showMenu(){

container.removeAll();

if( gameMenu == null )
gameMenu = new GameMenu( this );

container.add( gameMenu );
container.repaint();

}

private void initializeMainWindow() {

this.setExtendedState( JFrame.MAXIMIZED_BOTH );
this.setUndecorated( true );
this.setVisible( true );
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );


}
[/Java]

Um nun den GamePanel anzuzeigen habe ich folgende Methode in der Klasse Main:
[Java]
public void showGamePanel(){

container.removeAll();

gamePanel = new GamePanel( this );

container.add( gamePanel );
container.repaint();
}
[/Java]

Der Konstruktor von GamePanel sieht so aus:
[Java]
protected GamePanel( Main main ) {

this.main = main;
this.setSize( Main.getScreenWidth(), Main.getScreenHeight() );
this.addKeyListener( new GamePanelListener( this ) );
initializeLists(); // creates lists and adds the levels


}
[/Java]

Ich hatte schon früher Probleme damit, dass die gewünschte Komponente nicht den Fokus hat. Wenn ich den KeyListener auf den JFrame lege, dann funktioniert er. Ich möchte den KeyListener aber lieber nicht auf dem JFrame.
Hat jemand eine Idee wie ich dieses Problem lösen kann? Ich habe schon diverse Dinge ausprobiert wie 'requestFocusInWindow()' und solches. Hat leider nichts gebracht.

PS:
Ich hoffe, dass ich mich verständlich ausdrücken konnte ^^
 
S

SlaterB

Gast
wann und wo rufst du das auf?, vor oder nach setVisible(true) kann schon einen Unterschied machen,

ein vollständiges Beispielprogramm wäre günstig, so wie es hier funktioniert:
Java:
public class Test {
    public static void main(String[] args)  {
        JFrame f = new JFrame();
        JPanel p = new JPanel();
        f.add(p);
        p.addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e)  {
                    System.out.println("key: " + e.getKeyChar());
                }
            });
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200, 200);
        f.setVisible(true);
        p.requestFocusInWindow();
    }
}

generell sind KeyBindings vielleicht die bessere Idee, hier KeyListener mit Links zu Bindings + Focus:
How to Write a Key Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)
 

icarus2

Top Contributor
Ich kenne mich mit KeyBindings nicht aus... aber ich werde mir das ganze mal durchlesen und beibringen.

Der folgende Code ist kompilierbar. Ich habe so viel rausgenommen wie nur möglich.

Klasse Main:
[Java]

package surface;

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class Main extends JFrame {


private static final long serialVersionUID = 1L;
private static final int SCREEN_WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
private static final int SCREEN_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;

private GameMenu gameMenu;
private GamePanel gamePanel;

private Container container;

private Main() {

container = getContentPane();

showMenu();
initializeMainWindow();

}

private void initializeMainWindow() {

this.setExtendedState( JFrame.MAXIMIZED_BOTH );
this.setUndecorated( true );
this.setVisible( true );
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

public static int getScreenWidth(){
return SCREEN_WIDTH;
}

public static int getScreenHeight(){
return SCREEN_HEIGHT;
}

/**
* Removes all components from the Container and adds the game menu to it. It automatically creates a game menu
* at first usage
*/
public void showMenu(){

container.removeAll();

if( gameMenu == null )
gameMenu = new GameMenu( this );

container.add( gameMenu );
container.repaint();

}

public void showGamePanel(){

container.removeAll();

gamePanel = new GamePanel( this );

container.add( gamePanel );
container.repaint();
}

public static void main( String[] args ) {

EventQueue.invokeLater( new Runnable() {
@Override
public void run(){
new Main();
}
});

}

}
[/Java]

Klasse GameMenu
[Java]

package surface;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JPanel;

public class GameMenu extends JPanel implements ActionListener {

private static final long serialVersionUID = 1L;

private JButton startButton, controlsButton, exitButton;

private Main main;

protected GameMenu( Main main ){

this.main = main;

this.setSize( Main.getScreenWidth(), Main.getScreenHeight() );
this.setLayout( null );

initializeButtons();
}

private void initializeButtons(){

// The button width and height is adjusted relative to the screen dimensions
final int buttonWidth = Main.getScreenWidth() / 4;
final int buttonHeight = Main.getScreenHeight() / 10;
final int xLocationCentered = Main.getScreenWidth() / 2 - buttonWidth / 2;
int yLocation = Main.getScreenHeight() / 3; // y location of the start button
final int yButtonDistance = 40; // vertical distance between the buttons

Font font = new Font( "Arial", Font.BOLD, 35); // new font is created for the buttons

startButton = new JButton("Start Game!");
startButton.setSize( buttonWidth, buttonHeight );
startButton.setLocation( xLocationCentered, yLocation );
startButton.setFont( font );
startButton.setFocusable( false );
startButton.addActionListener( this );
yLocation += yButtonDistance + buttonHeight; // y coordinate is adjusted

controlsButton = new JButton("Controls");
controlsButton.setSize( buttonWidth, buttonHeight );
controlsButton.setLocation( xLocationCentered, yLocation );
controlsButton.setFont( font );
controlsButton.setFocusable( false );
controlsButton.addActionListener( this );
yLocation += yButtonDistance + buttonHeight; // y coordinate is adjusted

exitButton = new JButton("Exit");
exitButton.setSize( buttonWidth, buttonHeight );
exitButton.setLocation( xLocationCentered, yLocation );
exitButton.setFont( font );
exitButton.setFocusable( false );
exitButton.addActionListener( this );

add( startButton );
add( controlsButton );
add( exitButton );

}

@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );

g.drawString("GameMenu", 400, 400);


}

@Override
public void actionPerformed( ActionEvent e ) {

if( e.getSource().equals( startButton )){
main.showGamePanel();
}

else if( e.getSource().equals( controlsButton ) ) {

}

else if( e.getSource().equals( exitButton ) ) {
System.exit( 0 );
}

}


}
[/Java]

GamePanel:
[Java]

package surface;



import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.JPanel;


public class GamePanel extends JPanel {

private Main main;

protected GamePanel( Main main ) {

this.main = main;
this.setSize( Main.getScreenWidth(), Main.getScreenHeight() );
this.requestFocusInWindow();
this.addKeyListener( new GamePanelListener( this ) );

}



@Override
public void paintComponent( Graphics g ){
super.paintComponent( g );

g.drawString("GamePanel", 400, 400);

}

}
[/Java]

GamePanelListener
[Java]

package surface;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GamePanelListener extends KeyAdapter {

private GamePanel gamePanel;

protected GamePanelListener( GamePanel gamePanel ){
this.gamePanel = gamePanel;
}

@Override
public void keyReleased( KeyEvent e ){

System.out.println("GamePanelListener: Key Released");

}

}

[/Java]
 
Zuletzt bearbeitet:
S

SlaterB

Gast
hast du auch dein Denken rausgenommen? sorry ;)

requestFocusInWindow(); steht hier doch im GamePanel-Konstruktor, also VOR setVisible(true),
genau wie ich es in meiner ersten Antwort schon als mögliche Problem-Ursache angemerkt hatte
 

icarus2

Top Contributor
slaterb hat gesagt.:
hast du auch dein denken rausgenommen? Sorry ;)
Nicht mit Absicht aber es sieht ganz danach aus ^^

slaterb hat gesagt.:
requestfocusinwindow(); steht hier doch im gamepanel-konstruktor, also vor setvisible(true),
genau wie ich es in meiner ersten antwort schon als mögliche problem-ursache angemerkt hatte

Ich rufe gamePanel.requestFocusInWindow() jetzt in der Methode showGamePanel() nach dem container.repaint() auf und es klappt. Mir war irgendwie nicht klar, dass da ja eigentlich ein setVisible vorkommt, weil es nicht explizit da steht.

Vielen Dank für die Hilfe!

PS:
Werde mir die KeyBindings trotzdem mal anschauen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
G AWT Wie bekomme ich einen zeitgesteuerten robot hin? AWT, Swing, JavaFX & SWT 6
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
S Bekomme bein Buttonklick das Jtextfield nicht ausgegeben AWT, Swing, JavaFX & SWT 8
Madlip SWT Wie bekomme ich e.getSource xxx AWT, Swing, JavaFX & SWT 2
A Bekomme das Label nicht in die Mitte von Reihe AWT, Swing, JavaFX & SWT 7
L Wie bekomme ich ein Mehrzeiliges JTextField? AWT, Swing, JavaFX & SWT 12
P Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes... AWT, Swing, JavaFX & SWT 8
pinerski Swing Wie bekomme ich bei einer JComboBox den Text? AWT, Swing, JavaFX & SWT 2
K bekomme Seitenwechsel nicht hin AWT, Swing, JavaFX & SWT 4
S Hilfe! Bekomme Daten nicht ausgelesen AWT, Swing, JavaFX & SWT 3
V Hilfe :( bekomme textarea nicht versetzt AWT, Swing, JavaFX & SWT 2
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5
I selectedText: Wie bekomme ich Zugriff auf den Text? AWT, Swing, JavaFX & SWT 4
H Bekomme den TreeSelectionListener nicht zum Laufen AWT, Swing, JavaFX & SWT 5
V SWT (JFace): bekomme das FormLayout nicht hin. AWT, Swing, JavaFX & SWT 4
G Wie bekomme ich ein JFrame/JDialog zum Blinken? AWT, Swing, JavaFX & SWT 6
E Wie bekomme ich hier ein vertikale JScrollPane hin?? AWT, Swing, JavaFX & SWT 4
G Bekomme immer: NullPointerException AWT, Swing, JavaFX & SWT 2
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
H Swing Wie Fokus von JTextField entfernen? AWT, Swing, JavaFX & SWT 9
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
C SWT MenuBar & MenuItems Fokus wenn F10 unterdrücken/entfernen AWT, Swing, JavaFX & SWT 9
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
B Swing Fokus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
J Swing Fokus JInternalFrame fehlerhaft AWT, Swing, JavaFX & SWT 4
B Fokus markierung entfernen AWT, Swing, JavaFX & SWT 2
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
A Vordergrund und Fokus setzten oder Modales Einabefeld AWT, Swing, JavaFX & SWT 28
G SWT Fokus auf MsgBox setzen AWT, Swing, JavaFX & SWT 3
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
J Swing Wie Fokus richtig setzen? AWT, Swing, JavaFX & SWT 7
T Swing Fokus AWT, Swing, JavaFX & SWT 2
H Swing Problem mit FocusCycleRoot, der FocusTraversalPolicy und dem Fokus AWT, Swing, JavaFX & SWT 2
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
E Swing Mit rechter Maustaste Fokus in JList setzen?! AWT, Swing, JavaFX & SWT 3
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
agent47 Swing auf Schnelltaste ohne Fokus hören AWT, Swing, JavaFX & SWT 2
M JSpinner als TableCellEditor; buttons nur bei fokus sichtbar AWT, Swing, JavaFX & SWT 14
Z Fokus auf Eingabefeld bei showMessageDialog setzen AWT, Swing, JavaFX & SWT 3
N Herkunft des Fokus erkennbar (via Klick oder Tab-Steuerung)? AWT, Swing, JavaFX & SWT 4
F Panel kann nicht Fokus erhalten AWT, Swing, JavaFX & SWT 2
N Textfeld füllen sobald es den Fokus verliert AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
multiholle AWT Hotkey ohne Fokus AWT, Swing, JavaFX & SWT 6
W JTextArea/TextArea kriegt keinen Fokus AWT, Swing, JavaFX & SWT 6
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
G JOptionPane.showInputDialog(): Texteingabe und Fokus AWT, Swing, JavaFX & SWT 3
V Kein Fokus für Key Bindings auf JPanel bzw JApplet AWT, Swing, JavaFX & SWT 2
R Fokus von GUI-Elementen AWT, Swing, JavaFX & SWT 3
F Herausfinden, auf welchem Objekt der Fokus liegt AWT, Swing, JavaFX & SWT 2
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
S Eventhandling obwohl Fenster nicht im Fokus AWT, Swing, JavaFX & SWT 5
GilbertGrape bei "Enter" Funktion ausführen, egal wo der Fokus AWT, Swing, JavaFX & SWT 2
A Fokus in ein Textfeld setzen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A ComboBox soll reagieren ohne fokus AWT, Swing, JavaFX & SWT 7
C Probleme einem JPanel den Fokus zuzuweisen AWT, Swing, JavaFX & SWT 2
A Fokus und JTextField AWT, Swing, JavaFX & SWT 35
T JList mit eigenem TransferHandler: Fokus(?)-Probleme AWT, Swing, JavaFX & SWT 4
D JButton mit Fokus soll auf ENTER reagieren AWT, Swing, JavaFX & SWT 3
M Frame erhält ungewollt den Fokus AWT, Swing, JavaFX & SWT 10
V JTable Handling Fokus on Keystroke und Maus Doubleclick AWT, Swing, JavaFX & SWT 9
S JTextArea mit Scrollbar,append Text mit Fokus? AWT, Swing, JavaFX & SWT 5
G Event, wenn JTextField Fokus verliert? AWT, Swing, JavaFX & SWT 2
C Der hartnäckige Fokus AWT, Swing, JavaFX & SWT 3
G Keylistener/Fokus Problem AWT, Swing, JavaFX & SWT 3
B Fokus Problem unter Linux AWT, Swing, JavaFX & SWT 7
J JFrame und Fokus AWT, Swing, JavaFX & SWT 4
N Fokus Reihenfolge ändern AWT, Swing, JavaFX & SWT 12
M Fokus auf ein JTextfield in einem JDialog setzen AWT, Swing, JavaFX & SWT 6
I fokus AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben