Java 中 JButton 的击键/热键

2024-05-16

最初我使用 JMenu 并建立热键以使用加速器工作。它运行得很好。现在我想在 JButton 中实现相同的行为,但我陷入困境。 这是我编写的代码:请分享您的想法,以便我可以走上正确的道路。

import javax.swing.*;

import java.awt.Event;
import java.awt.event.*;
import java.util.Arrays;

public class ShowDialogBox{
    JFrame frame;
    public static void main(String[] args){
        ShowDialogBox db = new ShowDialogBox();
    }

    public ShowDialogBox(){
        frame = new JFrame("Show Message Dialog");
        // create an Action doing what you want
        KeyStroke keySave = KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK); 
        Action performSave = new AbstractAction("Click Me") {  
            public void actionPerformed(ActionEvent e) {     
                 //do your save
                 System.out.println("clickMe");
            }
        }; 


        JButton button = new JButton("Click Me");


        button.getActionMap().put("Click Me", performSave);
        button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keySave, "Click Me");

        button.addActionListener(new MyAction());
        frame.add(button);
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public class MyAction implements ActionListener{
        public void actionPerformed(ActionEvent e){



            String[] items = {
                    "1", "2", "3"
                };
                JList list = new JList(items);
                JPanel panel = new JPanel();
                panel.add(list);
                JOptionPane.showMessageDialog(null, panel);

        }

提前致谢


要使您的键绑定正常工作,请使用KeyEvent.CTRL_DOWN_MASK不是KeyEvent.CTRL_MASK.

我自己,我更喜欢使用 AbstractActions 而不是 ActionListeners,因为这样菜单和按钮可以共享相同的 Actions,并且 Actions 可以有自己的助记键,尽管这需要是 alt-key 组合。例如:

import java.awt.Component;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class ShowMyDialogTest {

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Show MyDialog Test");

      JPanel mainPanel = new JPanel();
      Action showAction = new ShowDialogAction(frame, "Show Dialog");
      final JButton showDialogBtn = new JButton(showAction);
      mainPanel.add(showDialogBtn);
      mainPanel.setPreferredSize(new Dimension(600, 400));

      KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK);
      int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
      InputMap inputMap = showDialogBtn.getInputMap(condition);
      ActionMap actionMap = showDialogBtn.getActionMap();
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new AbstractAction() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            showDialogBtn.doClick();
         }
      });

      JMenuItem showMenuItem = new JMenuItem(showAction);
      JMenuItem exitMenuItem = new JMenuItem(new DisposeAction("Exit", KeyEvent.VK_X));
      JMenu fileMenu = new JMenu("File"); 
      fileMenu.setMnemonic(KeyEvent.VK_F);
      fileMenu.add(showMenuItem);
      fileMenu.add(exitMenuItem);

      JMenuBar menuBar = new JMenuBar();
      menuBar.add(fileMenu);
      frame.setJMenuBar(menuBar);      

      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class ShowDialogAction extends AbstractAction {
   private JFrame frame;
   private ShowDialogPanel dialogPanel;
   private JDialog dialog;

   public ShowDialogAction(JFrame frame, String name) {
      super(name);
      int mnemonic = (int) name.charAt(0);
      putValue(MNEMONIC_KEY, mnemonic);
      this.frame = frame;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      if (dialogPanel == null) {
         dialogPanel = new ShowDialogPanel();
      }
      if (dialog == null) {
         dialog = new JDialog(frame, "My Dialog", ModalityType.APPLICATION_MODAL);
         dialog.getContentPane().add(dialogPanel);
         dialog.pack();
      }
      dialog.setLocationRelativeTo(frame);
      dialog.setVisible(true);
      // TODO add any code that extracts data from dialogPanel

   }
}

class ShowDialogPanel extends JPanel {
   private JButton button = new JButton(new DisposeAction("Close", KeyEvent.VK_C));

   public ShowDialogPanel() {
      add(button);
   }
}

class DisposeAction extends AbstractAction {
   private static final long serialVersionUID = 1L;

   public DisposeAction(String name, int mnemonic) {
      super(name);
      putValue(MNEMONIC_KEY, mnemonic);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      Component component = (Component) e.getSource();
      Window win = SwingUtilities.getWindowAncestor(component);
      if (win == null) {
         JPopupMenu popup = (JPopupMenu) component.getParent();
         if (popup == null) {
            return;
         }
         component = popup.getInvoker();
         win = SwingUtilities.getWindowAncestor(component);
      }
      win.dispose();
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中 JButton 的击键/热键 的相关文章

随机推荐

  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 使用 Express.js 和 NodeJS,您可以通过响应正文中的重定向发送 JSON

    我正在尝试通过 302 重定向发送 JSON 在 ExpressJS 中这可能吗 API 声明可以添加主体res json 例如 res json 302 name larry 在接收端 重定向的目的地 主体是空的 这是一些示例代码 发送应
  • 下载进度条在 iOS 企业发行版中没有改变进度

    我正在通过企业分发开发和分发 iPad 应用程序 它们下载并执行良好 因此一切正常 Web 链接 ipa 文件 plist 文件 配置 问题 是 当用户单击链接进行下载时 iPad 中显示下载进度的进度条显示 正在等待 但却是空的并且永远不
  • 为什么无法从 WEB-INF 文件夹内加载 POSModel 文件?

    我在我的 Web 项目中使用 Spring MVC 我将模型文件放在 WEB INF 目录中 String taggerModelPath WEB INF lib en pos maxent bin String chunkerModelP
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 如何在 ASP.NET MVC 中使用 Html.Action() 将参数传递给 Action?

    我一直在使用Html Action ActionName ControllerName 跨控制器调用子操作 而无需在 Views Shared 中拥有视图 这对于显示会话或 cookie 信息等内容非常有效 我不只是访问 cookie 而是
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

    我有一个正在运行的 python 程序 它使用 suds 通过 SOAP 获取大量数据 Web服务是通过分页功能实现的 这样我就可以抓取nnn每个 fetch 调用的行并获取下一个nnn与后续的电话 如果我使用如下代码向 HTTP 服务器进
  • 500.19 从 iis 运行 nuget gallery 时出错

    我正在尝试运行 Nuget Gallery 的本地安装 但收到与错误配置文件相关的 500 错误 但是 只有从 IIS 运行时才会发生这种情况 如果我从 IIS Express 运行它工作正常 谁能给我任何指示吗 Error Summary
  • Labview 2011 中的 DLL 加载错误

    我在 LabVIEW 中加载 DLL 时遇到了问题 我正在使用 LabVIEW 连接到流量计 为此 制造流量计的公司非常好地为我提供了一个子 VI 库 这些子 VI 中的每一个都调用该公司提供的两个 DLL 库之一中的函数 因此 这些子 V
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • Discord.py 嵌入中禁用按钮/冻结按钮

    I m trying to make a replica of this bot in which when I press any of the buttons below it shows a dropdown menu and you
  • 准备好的语句需要 0 个参数,给定 1 个参数..,使用 php 手册示例 [重复]

    这个问题在这里已经有答案了 我直接从 php 手册示例中获取了这个 它几乎与我需要的相同 但我仍然收到此错误 有人可以告诉我我错过了什么吗 stmt link gt prepare SELECT obitBody Photo FROM tn
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j