代替
KeyListener,使用
按键绑定
,
Action并对每个面板都有不同的实现。通过使用
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT输入映射,两个面板都可以响应。
附录:由于搜索是在找到有效的键绑定之后结束的,因此下面的示例 将 事件 转发
到a的元素
List<MyPanel>,每个元素可以通过available进行不同的响应
Action。
import java.awt.EventQueue;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.List;import javax.swing.AbstractAction;import javax.swing.Action;import javax.swing.BorderFactory;import javax.swing.JComponent;import javax.swing.Jframe;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.KeyStroke;public class TwoPanelsTest extends Jframe { private MyPanel one = new MyPanel("One"); private MyPanel two = new MyPanel("Two"); private List<MyPanel> list = Arrays.asList(one, two); public TwoPanelsTest() { super("TwoPanelsTest"); this.setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout(0, 1, 10, 10)); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); panel.add(one); panel.add(two); panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up"); panel.getActionMap().put("up", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { for (MyPanel panel : list) { panel.getAction().actionPerformed(e); } } }); this.add(panel); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } private static class MyPanel extends JPanel { private String string = " will be updated though its action."; private Action action = new UpdateAction(this); private String name; private JLabel label; public MyPanel(String name) { this.name = name; this.label = new JLabel(name + string, JLabel.CENTER); this.setLayout(new GridLayout()); this.setFocusable(true); this.add(label); } public Action getAction() { return action; } private void update() { label.setText(name + ": " + System.nanoTime()); } private static class UpdateAction extends AbstractAction { private MyPanel panel; public UpdateAction(MyPanel panel) { this.panel = panel; } @Override public void actionPerformed(ActionEvent ae) { panel.update(); } } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { TwoPanelsTest t = new TwoPanelsTest(); } }); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)