栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使两个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(); }        });    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498218.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号