如何使两个JPanels侦听同一事件?

如何使两个JPanels侦听同一事件?,第1张

如何使两个JPanels侦听同一事件?

代替

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(); }        });    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5490339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存