JComponent's requestFocus() - Wieso nicht immer anwendbar?

Zitrus

Bekanntes Mitglied
Hallo,
Ich habe ein eigenes Spiel geschrieben gehabt und habe heute mal wieder einen Blick darauf geworfen.
Ich verstehe nun aber nicht wieso ich die Methode requestFocus() nicht direkt im Konstruktor aufrufen kann, sondern sie in der Methode aufrufen muss. Hier mal mein Code:
Java:
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Font;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.Random;
import java.net.URL;

public class Spiel extends JFrame
{    
    MyPanel panel;
    ImageIcon IFenster;
    URL UFenster;

    public static void main(String args[]) {
        new Spiel();
    }

    public Spiel()
    {   
        super("Go Home");

        setResizable(false);
        setSize(590,710);
        setLocation(300,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        UFenster = getClass().getResource("Haus.png");
        IFenster = new ImageIcon(UFenster);
        setIconImage(IFenster.getImage());

        MyPanel panel = new MyPanel();

        add(panel);

        setVisible(true);
    }

    class MyPanel extends JPanel implements KeyListener,ActionListener //KeyListener und ActionListener
    {                                                                   //werden implementiert
        JTextArea t1;        //Dekl. der "Zusätze"
        JTextArea t2;
        JLabel l3;
        JButton wuerfel;
        JOptionPane gewonnen;

        Image Ispielbrett;    //Dekl. der Images
        Image Irot1;
        Image Irot2;
        Image Iblau1;
        Image Iblau2;

        URL Uspielbrett;
        URL Urot1;
        URL Urot2;
        URL Ublau1;
        URL Ublau2;

        Hintergrund spielbrett;

        Figur figur1;        //Dekl. der Figuren
        Figur figur2;
        Figur figur3;
        Figur figur4;
        Figur aktuelleFigur1;
        Figur aktuelleFigur2;

        boolean bewegt; // Wurde die aktuelle Figur schonmal bewegt?

        public MyPanel()
        {
            setLayout(null); //null-Layout für die Würfel und Label
            setSize(590,710);

            loadImages();

            spielbrett = new Hintergrund(Ispielbrett,0,0);

            wuerfel = new JButton("Wuerfel");
            wuerfel.setBounds(0,585,100,100);
            wuerfel.addActionListener(this);

            t1 = new JTextArea();
            t1.setBounds(485,585,100,100);
            t1.setFont(new Font("Verdana", 0, 72));
            t1.setEditable(false);

            t2 = new JTextArea();
            t2.setBounds(300,585,100,100);
            t2.setFont(new Font("Verdana", 0, 72));
            t2.setEditable(false);

            l3 = new JLabel();
            l3.setBounds(110 ,585,200,100);
            l3.setFont(new Font("Verdana", 0, 20));
            l3.setText("Aktuelle Figuren:");

            figur1 = new Figur(Irot1,155,155); // Ein Feld ist 57!
            figur2 = new Figur(Iblau1,383,155); // Home-Feld ist auf: 269/269
            figur3 = new Figur(Irot2,155,383);
            figur4 = new Figur(Iblau2,383,383);

            gewonnen = new JOptionPane();

            this.addKeyListener(this);
            this.setFocusable(true);

            add(t1);
            add(t2);
            add(l3);
            add(wuerfel);
        }

        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g); // Damit es nach jeder Bewegung repainted wird!
            spielbrett.paintComponent(g); //Zum zeichnen des Spielbretts/der Figuren
            figur1.paintComponent(g); // Überschriebene paintComponent(g)-Methoden werden 
            figur2.paintComponent(g); // (der jeweiligen Klasse) ausgeführt!
            figur3.paintComponent(g);
            figur4.paintComponent(g);
        }

        public void loadImages() { // Methode liest die Images
            Uspielbrett = getClass().getResource("spielbrett.png");
            Urot1 = getClass().getResource("figurrot1.png");
            Urot2 = getClass().getResource("figurrot3.png");
            Ublau1 = getClass().getResource("figurblau2.png");
            Ublau2 = getClass().getResource("figurblau4.png");

            try {
                Iblau1 = ImageIO.read(Ublau1); // Images werden zugewiesen
                Iblau2 = ImageIO.read(Ublau2);
                Irot1 = ImageIO.read(Urot1);
                Irot2 = ImageIO.read(Urot2);
                Ispielbrett = ImageIO.read(Uspielbrett);
            } catch(IOException ex) {
                System.out.println("Fehler: " + ex.toString());// Falls kein Bild gefunden worden ist
                // gebe den Fehler (als String) aus.
            }
        }

        public void option() {
            if(figur1.gewonnen() == true || figur2.gewonnen() == true || figur3.gewonnen() == true
            || figur4.gewonnen() == true) { // Wenn irgendeine Figur gewonnen hat...
                int eingabe = gewonnen.showConfirmDialog(null, //Speichere den Knopdruck als int
                        "Möchtest du nochmal spielen?",
                        "Nochmal spielen?",
                        gewonnen.YES_NO_CANCEL_OPTION,
                        gewonnen.PLAIN_MESSAGE);
                if(eingabe == 0) { // Wenn "Ja"
                    figur1 = new Figur(Irot1,155,155);
                    figur2 = new Figur(Iblau1,383,155);
                    figur3 = new Figur(Irot2,155,383);
                    figur4 = new Figur(Iblau2,383,383);
                    aktuelleFigur1 = null;
                    aktuelleFigur2 = null;
                    t1.setText(null);
                    t2.setText(null);
                    this.repaint();
                }
                else if(eingabe == 1) { // Wenn "Nein"
                    System.exit(0);
                }
                else if(eingabe == 2) { // Wenn "Abbrechen"
                }
            }
        }

        public void kriegeAktuellenSpieler() {
            Random r = new Random(); //Random Objekt wird dekl/init
            int zufall1 = r.nextInt(4) + 1; //2 Zufallszahlen werden gewürfelt
            int zufall2 = r.nextInt(4) + 1;

            if(zufall1 == 1) { // Wenn zufall1 == 1 dann aktFig1 = fig1
                t1.setText(" 1");
                aktuelleFigur1 = figur1;
            }
            else if(zufall1 == 2) {
                t1.setText(" 2");
                aktuelleFigur1 = figur2;
            }
            else if(zufall1 == 3) {
                t1.setText(" 3");
                aktuelleFigur1 = figur3;
            }
            else if(zufall1 == 4) {
                t1.setText(" 4");
                aktuelleFigur1 = figur4;
            }

            if(zufall2 == 1) {// Wenn zufall2 == 1 dann aktFig2 = fig1 
                t2.setText(" 1");
                aktuelleFigur2 = figur1;
            }
            else if(zufall2 == 2) {
                t2.setText(" 2");
                aktuelleFigur2 = figur2;
            }
            else if(zufall2 == 3) {
                t2.setText(" 3");
                aktuelleFigur2 = figur3;
            }
            else if(zufall2 == 4) {
                t2.setText(" 4");
                aktuelleFigur2 = figur4;
            }

            this.requestFocus();
        }

        public void actionPerformed(ActionEvent e) { //ActionListener-Methode
            if(figur1.gewonnen() == false && figur2.gewonnen() == false && figur3.gewonnen() ==
            false && figur4.gewonnen() == false) {
                if(e.getSource() == wuerfel) { // Wenn der Knopf gedrückt wird
                    kriegeAktuellenSpieler(); // Bekomme aktuellenSpieler(bzw. gebe auf Areas aus)
                    bewegt = false; // Und die Figuren dürfen sich bewegen
                }
            }
            else { //Wenn eine Figur gewonnen hat..
                option(); // Zeige mir das JOptionPane
            }
        }

        public void keyReleased(KeyEvent e) {

        }

        public void keyPressed(KeyEvent e) { // Wenn Tasten "gedrückt"
            if(bewegt == false) { // Nur wenn bewegt = false!
                if(aktuelleFigur1 != null && aktuelleFigur2 != null) { // Wenn aktFig einen Wert hat
                    if(e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D) {
                        aktuelleFigur1.x += 57; // Bewege um ein Feld nach Rechts,
                        aktuelleFigur2.x += 57; // Bewege um ein Feld nach Rechts
                        this.repaint(); // Zeichne das Panel neu(Um die Veränderung sichtbar zu machen)
                        bewegt = true; // Setze bewegt = true, damit die keyPressed 
                        option();       // nicht betreten werden kann solange man nicht nochmal würfelt
                    }
                    else if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A) {
                        aktuelleFigur1.x -= 57;
                        aktuelleFigur2.x -= 57;
                        this.repaint();
                        bewegt = true;
                        option();
                    }
                    else if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
                        aktuelleFigur1.y -= 57;
                        aktuelleFigur2.y -= 57;
                        this.repaint();
                        bewegt = true;
                        option();
                    }
                    else if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S) {
                        aktuelleFigur1.y += 57;
                        aktuelleFigur2.y += 57;
                        this.repaint();
                        bewegt = true;
                        option();
                    }
                }
            }

            if(e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE) {
                if(figur1.gewonnen() == false && figur2.gewonnen() == false && figur3.gewonnen() ==
                false && figur4.gewonnen() == false) {
                    kriegeAktuellenSpieler();
                    bewegt = false;
                }
                else {
                    option(); 
                }
            }
            
            if(e.getKeyCode() == KeyEvent.VK_H) {
                JOptionPane secret = new JOptionPane();
                int eingabe = secret.showConfirmDialog(null, 
                        "Drück nicht 'h' du huanschmock!\n-By Hendrik und Co. KG",
                        "Secret!",
                        secret.CLOSED_OPTION,
                        secret.PLAIN_MESSAGE);
            }
            }
        

        public void keyTyped(KeyEvent e) {
        }
    }
}
(Ich denke mal die Figur und die Hintergrund Klassen erschließen sich)

Hier die "betroffene Stelle"
Java:
 public void kriegeAktuellenSpieler() {
            Random r = new Random(); //Random Objekt wird dekl/init
            int zufall1 = r.nextInt(4) + 1; //2 Zufallszahlen werden gewürfelt
            int zufall2 = r.nextInt(4) + 1;

            if(zufall1 == 1) { // Wenn zufall1 == 1 dann aktFig1 = fig1
                t1.setText(" 1");
                aktuelleFigur1 = figur1;
            }
            else if(zufall1 == 2) {
                t1.setText(" 2");
                aktuelleFigur1 = figur2;
            }
            else if(zufall1 == 3) {
                t1.setText(" 3");
                aktuelleFigur1 = figur3;
            }
            else if(zufall1 == 4) {
                t1.setText(" 4");
                aktuelleFigur1 = figur4;
            }

            if(zufall2 == 1) {// Wenn zufall2 == 1 dann aktFig2 = fig1 
                t2.setText(" 1");
                aktuelleFigur2 = figur1;
            }
            else if(zufall2 == 2) {
                t2.setText(" 2");
                aktuelleFigur2 = figur2;
            }
            else if(zufall2 == 3) {
                t2.setText(" 3");
                aktuelleFigur2 = figur3;
            }
            else if(zufall2 == 4) {
                t2.setText(" 4");
                aktuelleFigur2 = figur4;
            }

            this.requestFocus();
        }
 

javampir

Bekanntes Mitglied
Hi,
warum erbst du denn nicht von JPanel (was deine MyPanel-Klasse ja macht), sondern in der Hauptklasse von JFrame? Ich denke es wäre einfacher gleich von JPanel zu erben und dann gleich in der Klasse die Listener implementieren. der KeyListener gehört dann zu JFrame und du musst nicht extra fokussieren
Gruß
javampir
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
S Swing Schwierigkeiten mit JComponent AWT, Swing, JavaFX & SWT 4
T Swing JComponent vergrößern AWT, Swing, JavaFX & SWT 4
L JComponent und MouseMotionListener AWT, Swing, JavaFX & SWT 2
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
W JComponent - ComponentListener - resized / moved AWT, Swing, JavaFX & SWT 5
Developer_X Wie heißt das JComponent hier? AWT, Swing, JavaFX & SWT 2
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
A Abgeleitete JComponent wird nicht gezeichnet AWT, Swing, JavaFX & SWT 10
A JComponent Größe AWT, Swing, JavaFX & SWT 8
T jcomponent wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
P JComponent / JLabel drehen (Rotation) AWT, Swing, JavaFX & SWT 2
D JComponent erweitern AWT, Swing, JavaFX & SWT 4
1 JComponent -> java.lang.NullPointerException AWT, Swing, JavaFX & SWT 13
M 2x JComponent in einem JFrame darstellen? AWT, Swing, JavaFX & SWT 7
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
H JComponent == JTextfield? AWT, Swing, JavaFX & SWT 4
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
G JComponent nachträglich in JPanel einfügen AWT, Swing, JavaFX & SWT 5
M Ganzen Frame mit JComponent ausfüllen AWT, Swing, JavaFX & SWT 9
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
T JComponent nur in Swing verwendbar? AWT, Swing, JavaFX & SWT 6
M Mehrere Icons in einer JComponent AWT, Swing, JavaFX & SWT 5
Dragonfire Image von JComponent AWT, Swing, JavaFX & SWT 2
T x und y herrausfinden eines JComponent auf JFrame AWT, Swing, JavaFX & SWT 14
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
B "weiches" Bewegen von einem JComponent AWT, Swing, JavaFX & SWT 18
ARadauer JPanel vs JComponent AWT, Swing, JavaFX & SWT 2
I JDialog aus JComponent erstellen AWT, Swing, JavaFX & SWT 2
S JComponent u. JPanel ausdrucken AWT, Swing, JavaFX & SWT 3
J SWT JComponent Problem AWT, Swing, JavaFX & SWT 4
T JComponent überzeichnen? AWT, Swing, JavaFX & SWT 2
G JComponent in JTable AWT, Swing, JavaFX & SWT 8
M JComponent wird in JFrame nicht angezeigt AWT, Swing, JavaFX & SWT 4
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
S JComponent in JPanel darstellen AWT, Swing, JavaFX & SWT 2
N JComponent#getClientProperty(key) welche Schlüssel gibt es? AWT, Swing, JavaFX & SWT 3
E Drucken von JComponent. AWT, Swing, JavaFX & SWT 4
S JComponent ersetzen AWT, Swing, JavaFX & SWT 13
R Resize Problem bei JComponent AWT, Swing, JavaFX & SWT 2
M JButton in JComponent abfragen AWT, Swing, JavaFX & SWT 6
S Mausbehandlungen für JComponent AWT, Swing, JavaFX & SWT 7
M Verschiebbare JComponent AWT, Swing, JavaFX & SWT 5
C zeichnen auf jComponent AWT, Swing, JavaFX & SWT 3
S in einem JComponent zu zeichnen AWT, Swing, JavaFX & SWT 4
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
R JComponent malt seine Kinder nicht AWT, Swing, JavaFX & SWT 8
G JComponent Hintergrund AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G Graphics (g) und JComponent prob. AWT, Swing, JavaFX & SWT 2
G Klasse XYComponent extends JComponent AWT, Swing, JavaFX & SWT 3
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
H JRadioButton.requestFocus() - Problem AWT, Swing, JavaFX & SWT 2
C requestFocus bei modalem Dialog AWT, Swing, JavaFX & SWT 3
F requestFocus() auf ein TextField AWT, Swing, JavaFX & SWT 6
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
J JavaFX CSS einbinden - Wieso will das einfach nicht!!! AWT, Swing, JavaFX & SWT 1
LexeB4F setValueAT geht nicht... wieso? AWT, Swing, JavaFX & SWT 14
C Wieso nur erster Buchstabe bei Caesar-Entschlüsselung? AWT, Swing, JavaFX & SWT 2
A Swing JTable wird nicht über zurückegebene Referenz geaddet.Wieso nicht? AWT, Swing, JavaFX & SWT 5
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
P 2D-Grafik Wieso wird das Bild nicht angezeigt ? AWT, Swing, JavaFX & SWT 4
T wieso leere Oberfläche? AWT, Swing, JavaFX & SWT 5
G Swing Wieso braucht man nach setVisible mal ein revalidate und mal nicht? AWT, Swing, JavaFX & SWT 8
C Wieso funktionert der CellRenderer nicht? AWT, Swing, JavaFX & SWT 2
L Wieso werden die Icons nicht dargestellt? AWT, Swing, JavaFX & SWT 2
W Wieso SerialVersionUID bei Swing-Komponenten AWT, Swing, JavaFX & SWT 5
N Freiraum in der GUI - Wieso? AWT, Swing, JavaFX & SWT 6
S Wieso Fenster im EDT sichtbar machen? AWT, Swing, JavaFX & SWT 43
M Wieso geht das nicht! AWT, Swing, JavaFX & SWT 3
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
G Wieso wird meine Scrollbar nicht angezeigt? AWT, Swing, JavaFX & SWT 3
K JTable - wieso funktioniert der Autoscroll nicht? AWT, Swing, JavaFX & SWT 5
Paule JFrame bleibt leer, wieso? AWT, Swing, JavaFX & SWT 2
S Wieso werden die Bilder nicht angezeigt? AWT, Swing, JavaFX & SWT 4
G Progressbar aktualisiert sich nicht (vernünftig). WIESO? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben