Como fazer dois JPanels ouvirem o mesmo evento?

eu tenho umJFrame e dentro desteJFrame há doisJPanels. Quando pressiono uma tecla, os dois devem ouvir esse evento e agir. Eu quero pegar todos os eventos do teclado, e entregá-los para ambosJPanels. Você sabe como fazê-lo?

Edit: Desde que eles devem fazer coisas diferentes, eu preciso de dois ouvintes diferentes, desculpe por não ser específico.

Edit2: Eu fiz um código simples para mostrar o problema. Quando pressiono a tecla para cima, os doisJPanels exibido deve mudar sua string; neste código, apenas um deles realmente reage!

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

/**
*
 * @author antonioruffolo
 */
public class TwoPanelsTest extends JFrame {

public TwoPanelsTest() {

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setSize(800, 600);

    PanelTest panelTest1= new PanelTest();
    PanelTest panelTest2= new PanelTest();

    GridBagLayout layout= new GridBagLayout();
    this.setLayout(layout);

    GridBagConstraints c = new GridBagConstraints();

    c.ipadx = 220;
    c.ipady = 390;
    c.insets.right= 0;
    c.insets.left=30;
    layout.setConstraints(panelTest1, c);
    this.add(panelTest1);

    layout.setConstraints(panelTest2, c);
    c.ipadx = 220;
    c.ipady = 390;
    c.insets.right=250;
    c.insets.left=50;
    this.add(panelTest2);


    setVisible(true);
    setLocationRelativeTo(null);
    setTitle("Test");
    setFocusable(false);
}

private class PanelTest extends JPanel{

    private String string="I'm not called by the event";
    private InputMap inputmap;
    private ActionMap actionmap;

    public PanelTest(){
        setFocusable(false);
        setDoubleBuffered(true);

        this.setBackground(Color.WHITE);
        inputmap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
        actionmap = getActionMap();
        actionmap.put("up", new ActionController(this));
    }

    public void setString(String string){
        this.string=string;
    }

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

        Font infoFont= new Font("OCR A Std", Font.BOLD, 10);
        g.setFont(infoFont);
        g.drawString(string, 10, 50);
    }
}//PanelTest

private class ActionController extends AbstractAction{

    private PanelTest panel;

    public ActionController (PanelTest panel){
        this.panel=panel;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        panel.setString("Action performed");
        panel.repaint();
    }

}

public static void main(String[] args) {
    TwoPanelsTest t = new TwoPanelsTest();
}
}