2014-12-06 2 views
0

Я хочу, чтобы KeyEvent менял цвет фона моих JPanels. Ничего не происходит, когда я нажимаю что-либо на клавиатуре. Одна из моих спецификаций приложений заключается в том, что мне нужен «Индивидуальный компонент, расширенный от JPanel». поэтому у меня есть еще один класс для моей графической панели.KeyEvent не изменит цвет фона JPanels

Моя проблема когда G нажимается ничего не происходит, но моя центральная панель должна зеленеть ...

Вот код для части моего приложения.

public class Maths extends JFrame implements KeyListener 
{  
private JPanel pNorth = new JPanel(); 
private JPanel pSouth = new JPanel(); 
private JPanel pCenter = new JPanel(); 
private JPanel pEast = new JPanel(); 
private JPanel pWest = new JPanel(); 
private File file; 
private JPanel pDraw = new GraphicsPanel(); 

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

} 

public Maths() 
{ 
    mainFrame = new JFrame(); 

    mainFrame.setTitle("Maths Test Game"); 
    mainFrame.setLayout(new BorderLayout()); 
    mainFrame.setSize(1200, 800); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    mainFrame.add(pNorth, BorderLayout.NORTH); 
    mainFrame.add(pSouth, BorderLayout.SOUTH); 
    mainFrame.add(pCenter, BorderLayout.CENTER); 
    mainFrame.add(pEast, BorderLayout.EAST); 
    mainFrame.add(pWest, BorderLayout.WEST); 

    pNorth.setLayout(new FlowLayout()); 
    pSouth.setLayout(new FlowLayout()); 
    pCenter.setLayout(new FlowLayout()); 
    pEast.setLayout(new FlowLayout()); 
    pWest.setLayout(new FlowLayout()); 

    addKeyListener(this); 
    setFocusable(true); 

    mainFrame.setVisible(true); 
} 

class GraphicsPanel extends JPanel 
{ 
    GraphicsPanel() 
    { 
     // set a preferred size for the custom panel. 
     setPreferredSize(new Dimension(250, 300)); 
    } 
    @Override 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     // set blue color for drawing 
     g.setColor(Color.blue); 
     // face 
     g.drawOval(90, 70, 80, 80); 
     // eyes 
     g.drawOval(110, 95, 5, 5); 
     g.drawOval(145, 95, 5, 5); 
     // nose 
     g.drawLine(130, 95, 130, 115); 
     // mouth 
     g.drawArc(113, 115, 35, 20, 0, -180); 

    } 
} 

@Override 
public void keyPressed(KeyEvent e) 
{ 
    if(e.getKeyCode() == KeyEvent.VK_G) 
    { 
     pCenter.setBackground(Color.green); 
    } 
    repaint(); 
} 

@Override 
public void keyReleased(KeyEvent e) 
{ 

} 

@Override 
public void keyTyped(KeyEvent e) 
{ 

} 

} 
+0

Я заметил, что у вас есть лишний код, включенный в ваш вопрос. Не могли бы вы создать [MCVE] (http://stackoverflow.com/help/mcve), демонстрирующие конкретную проблему? – Vulcan

+0

[Как использовать привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

+0

Какой код не нужен? Я добавил графический класс, потому что думал, что это может быть проблемой. что, возможно, мне нужны мои ключевые исполнители в этом классе. – Fin

ответ

0

Есть множество причин, это, вероятно, не работает, как правило, вы не хотите, чтобы прикрепить KeyListener с до контейнеров верхнего уровня, как JFrame, так как они просто ко многим вещам, которые могут получить в пути и предотвратить раму от повышения ключевых событий.

Вместо этого используйте API привязки ключей. См. How to Use Key Bindings для получения более подробной информации.