JPanel i zdarzenia

0

witam
mam ramkę JFrame w której jest JPanel, klasa która dziedziczy po JPanel jest kontrolerem, na tym JPanelu ma się znajdować kilka rzeczy, chciałbym aby klawiatura była przechwytywana wlaśnie przez JPanel na skutek tego że ta klasa ma być kontrolerem

zauważyłem że jeśli JPanel jest pusty to przechwytuje wszystkie zdarzenia, jeśli wstawię tam choćby przycisk to nie przechwytuję żadnego...

Chciałbym się dowiedzieć co powinienem zrobić aby JPanel z zawartością przechwytywał zdarzenia

nie bardzo wiem w jakich znacznikach powinienem wstawić kod javy... dlatego wstawiłem w code, jakby co proszę mnie poprawić

import javax.swing.*;
import java.awt.event.*;
/**
 *
 * @author zimi
 */
class Dodaj implements KeyListener
{
    public void actionPerformed(ActionEvent e)
    {
        Przycisk.ramka.getContentPane().add(new JLabel("a"));
        Przycisk.ramka.getContentPane().validate();
    }
    public void keyReleased(KeyEvent e)
    {
        Przycisk.ramka.getContentPane().add(new JLabel("b"));
        Przycisk.ramka.getContentPane().validate();
    }
    
    public void keyPressed(KeyEvent e)
    {
        Przycisk.ramka.getContentPane().add(new JLabel("a"));
        Przycisk.ramka.getContentPane().validate();
    }
    
    public void keyTyped(KeyEvent e)
    {
        Przycisk.ramka.getContentPane().add(new JLabel("c"));
        Przycisk.ramka.getContentPane().validate();
    }
}

public class Przycisk extends JFrame{
    public static void main(String args[])
    {
        ramka = new Przycisk();
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.getContentPane().setLayout(new BoxLayout(ramka.getContentPane(), BoxLayout.Y_AXIS));
        ramka.setSize(200, 500);
        ramka.addKeyListener(new Dodaj());
        // wystarczy odkomentować 2 poniższe linijki i JPanel nie będzie przechwytywał zdarzeń
        //JButton przycisk = new JButton("przycisk");
        //ramka.getContentPane().add(przycisk);
        ramka.requestFocusInWindow();
        ramka.setVisible(true);
    }
    public static Przycisk ramka;
}

</php>
0
  1. Znaczniki powinny być takie
    < code=java >
    < /code > (bez odstepów)
  2. Zmieniłem kolejność instrukcji
        ramka.setVisible(true);
        ramka.requestFocusInWindow();

i stał się cud.
pozdrawiam

0

Lubię takie cudy...
rozumiem że focus jest nadawany dopiero po zrobieniu okna widzialnym? stąd moja wersja nie działała...?
jak podejrzewam jest to związane z linijką w dokumentacji:

This component must be displayable, focusable, <b>visible</b> and all of its ancestors (with the exception of the top-level Window) must be visible for the request to be granted.

jakoś wcześniej do mnie nie dotarło

dzięki za pomoc...

1 użytkowników online, w tym zalogowanych: 0, gości: 1