Swing i KeyListener. Jak to pogodzic?

0

To mój pierwszy post wiec Witam Wszystkich!

Pisze grę i natknąłem się na taki oto problem. Mam w programie obsługę klawiatury i jest wszystko fajnie do czasu gdy wcisnę jakiś JButton ze Swinga. Wtedy program całkowicie przestaje reagować na klawiaturę. Napisałem taki prosty programik który w idei jest podobny do mojego. Gdyby ktoś mógł go zmodyfikować tak żeby możliwe było jednoczesne obie akcje to byłbym bardzo wdzięczny :)

import java.awt.;
import java.awt.event.
;
import java.awt.geom.;
import java.util.
;
import javax.swing.*;

public class Main {
public static void main(String[] args) {
JFrame frame = new Frame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

public class Frame extends JFrame {

/** Creates a new instance of Frame */
public Frame() {
    setLocation(100,100);
    setSize(400, 300);
    
    Panel panel = new Panel();
    Container powZawartosci = getContentPane();
    
    JButton nowyPrzycisk = new JButton("OK");
    ActionListener newListener = new 
      ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
            
         }
      };
   nowyPrzycisk.addActionListener(newListener);   
   powZawartosci.add(panel,BorderLayout.CENTER);
   powZawartosci.add(nowyPrzycisk,BorderLayout.SOUTH);   
} 

}

class Panel extends JPanel
{
public Panel() {
//sluchacz paletki
UchwytKlawisza sluchacz_klawiatury = new UchwytKlawisza(); //nasluchuje wciskane klawisze
addKeyListener(sluchacz_klawiatury);
}

public boolean isFocusable() {
return true;
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle2D.Double tlo = new Rectangle2D.Double(x, y, szer , wys);
g2.setPaint(Color.black);
g2.fill(tlo);
repaint();
}

/**
*Clasa UchwytKlawisza (wewnetrzna). Nalezy do klasy Paletka. Obsluguje ruch paletki poprzez wciskanie klawiszy.
*/
public class UchwytKlawisza implements KeyListener {

    public void keyPressed(KeyEvent zdarzenie) {
        int kodKlawisza = zdarzenie.getKeyCode(); //otrzymujemy kod wcisnietego klawisza
        //sprawdzamy jaki klawisz zostal wcisniety i odpowiednio zezwala na przesuniecie paletki
        if (kodKlawisza==KeyEvent.VK_RIGHT)
            {x=x+3;}
        else if (kodKlawisza==KeyEvent.VK_LEFT)
            {x=x-3;}
    }
    
    public void keyReleased(KeyEvent zdarzenie) {}
    
    public void keyTyped(KeyEvent zdarzenie) {}
    
}

int x=100;
int y=100;
int szer=10;
int wys=20;

}

0

Zrób jedną małą zmianę:

nowyPrzycisk.setFocusable(false);

powoduje, że guzik nie dostanie fokusa. Zdarzenia klawiatury otrzymuje tylko komponent z fokusem.</wiki></ort>

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