私はJFrame
を持っていて、このJFrame
の中に2つあります。私がキーを押すと、両方の人はこのキーイベントを聞いて行動しなければなりません。私はすべてのキーボードイベントを受け取り、JPanel
の両方にそれらを配信したいと思います。あなたはそれをする方法を知っていますか?2つのJPanelを同じイベントで聴くには?
編集:彼らは異なることをしなければならないので、私は2人の異なるリスナーを必要とします。
Edit2:私はあなたに問題を示す簡単なコードを作った。アップキーを押すと、表示されているJPanel
の両方が文字列を変更する必要があります。このコードでは、実際に反応するのは1つだけです!
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();
}
}
私はKeyBindingsを使用する方が良いことを知っています。私は自分の問題を記述する簡単なコードを投稿しました。 "up"キーを押すと、両方とも表示された文字列を変更する必要がありますが、実際にそれらのうちの1人だけが行います!あなたの入力マップがこのケースに適切でないため、JComponent.WHEN_IN_FOCUSED_WINDOWを使用しました(変更した場合、動作しないことがわかります) – AR89
@ AR89:あなたが意味するものを見ています。上記の例を追加しました。 – trashgod
本当にありがとう、あなたの例は正常に動作し、私はテンプレートとしてそれを使用します! – AR89