Jak sprawić, by dwa JPanels słuchały tego samego wydarzenia?
mamJFrame
i wewnątrz tegoJFrame
istnieją dwaJPanel
s. Kiedy naciskam klawisz, obaj muszą słuchać tego kluczowego wydarzenia i działać. Chcę wziąć wszystkie wydarzenia z klawiatury i dostarczyć je do obuJPanel
s. Czy wiesz jak to zrobić?
Edytuj: Ponieważ muszą robić różne rzeczy, potrzebuję dwóch różnych słuchaczy, przepraszam, że nie jestem konkretny.
Edit2: Zrobiłem prosty kod, aby pokazać ci problem. Kiedy naciskam klawisz „w górę”, oba przyciskiJPanel
wyświetlane s muszą zmienić ich ciąg; w tym kodzie tylko jeden z nich rzeczywiście reaguje!
<code>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(); } } </code>