使 JButton 表现得像 JMenu

2023-12-24

我有以下 JMenuBar 代码(此代码取自免费的 java 程序调用JGuiD https://sourceforge.net/projects/jguid/并出于个人目的进行编辑)

import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.Dimension;
import java.awt.Color;

public class GuiDMenuBar extends JMenuBar
{
    JMenu m_file,m_edit,m_help;
    JMenuItem mi_f_new,mi_f_open,mi_f_save,mi_f_saveas,mi_f_exit;
    JMenuItem mi_e_cut,mi_e_copy,mi_e_paste,mi_e_delete;
    JMenuItem mi_v_motif,mi_v_java,mi_v_windows,mi_v_nimbus;
    JMenuItem mi_h_help,mi_h_about;
    JButton m_code;

    public GuiDMenuBar()
    {
        setBorderPainted(true);
        makeFileMenu();
        makeEditMenu();
        makeCodeButton();
        makeHelpMenu();
    }

    void makeFileMenu()
    {
        m_file = new JMenu("File");
        m_file.setMnemonic('F');

        mi_f_new = new JMenuItem("New",new ImageIcon("icons/new_project.png"));
        mi_f_new.setMnemonic('N');
        mi_f_open = new JMenuItem("Open",new ImageIcon("icons/open_project.png"));
        mi_f_open.setMnemonic('O');
        mi_f_save = new JMenuItem("Save",new ImageIcon("icons/save.png"));
        mi_f_save.setMnemonic('S');
        mi_f_saveas = new JMenuItem("Save Java File",new ImageIcon("icons/saveas.png"));
        mi_f_saveas.setMnemonic('J');
        mi_f_exit = new JMenuItem("Exit",new ImageIcon("icons/exit.png"));
        mi_f_exit.setMnemonic('X');

        mi_f_new.setAccelerator(KeyStroke.getKeyStroke("control N"));
        mi_f_open.setAccelerator(KeyStroke.getKeyStroke("control O"));
        mi_f_save.setAccelerator(KeyStroke.getKeyStroke("control S"));
        mi_f_saveas.setAccelerator(KeyStroke.getKeyStroke("control J"));
        mi_f_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));

        m_file.add(mi_f_new);
        m_file.add(mi_f_open);
        m_file.addSeparator();
        m_file.add(mi_f_save);
        m_file.add(mi_f_saveas);
        m_file.addSeparator();
        m_file.add(mi_f_exit);

        add(m_file);
    }

    void makeEditMenu()
    {
        m_edit = new JMenu("Edit");
        m_edit.setMnemonic('E');

        mi_e_cut = new JMenuItem("Cut",new ImageIcon("icons/cut.png"));
        mi_e_cut.setMnemonic('X');
        mi_e_copy = new JMenuItem("Copy",new ImageIcon("icons/copy.png"));
        mi_e_copy.setMnemonic('C');
        mi_e_paste = new JMenuItem("Paste",new ImageIcon("icons/paste.png"));
        mi_e_paste.setMnemonic('P');
        mi_e_delete = new JMenuItem("Delete",new ImageIcon("icons/delete.png"));
        mi_e_delete.setMnemonic('D');


        mi_e_cut.setAccelerator(KeyStroke.getKeyStroke("control X"));
        mi_e_copy.setAccelerator(KeyStroke.getKeyStroke("control C"));
        mi_e_paste.setAccelerator(KeyStroke.getKeyStroke("control V"));
        mi_e_delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));

        m_edit.add(mi_e_cut);
        m_edit.add(mi_e_copy);
        m_edit.add(mi_e_paste);
        m_edit.add(mi_e_delete);

        add(m_edit);
    }

    void makeHelpMenu()
    {
        m_help = new JMenu("Help");
        m_help.setMnemonic('H');

        mi_h_help = new JMenuItem("Help",new ImageIcon("icons/help.png"));
        mi_h_help.setMnemonic('H');
        mi_h_about = new JMenuItem("About");
        mi_h_about.setMnemonic('A');

        mi_h_help.setAccelerator(KeyStroke.getKeyStroke("F1"));
        mi_h_about.setAccelerator(KeyStroke.getKeyStroke("control A"));

        m_help.add(mi_h_help);
        m_help.addSeparator();
        m_help.add(mi_h_about);

        add(m_help);
    }

    void makeCodeButton()
    {
        m_code = new JButton();

        m_code.setOpaque(false);
        m_code.setContentAreaFilled(false);
        m_code.setBorder(null);
        m_code.setFocusable(false);

        m_code.setText("Code   Shift C");

        Dimension dBt = new Dimension(75,25);
        m_code.setMinimumSize(dBt);
        m_code.setPreferredSize(dBt);
        m_code.setMaximumSize(dBt);

        m_code.getModel().addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e) 
            {
                ButtonModel model = (ButtonModel) e.getSource();

                if(model.isRollover())
                {
                    m_code.setBackground(Color.RED);
                    m_code.setOpaque(true);
                } 

                else 
                {
                    m_code.setBackground(null);
                    m_code.setOpaque(false);
                    m_code.setContentAreaFilled(false);
                }
             }
        });

        m_code.setMnemonic('C');

        add(m_code);
    }

    public void addListeners(ActionListener al)
    {
        mi_f_new.addActionListener(al);
        mi_f_open.addActionListener(al);
        mi_f_save.addActionListener(al);
        mi_f_saveas.addActionListener(al);
        mi_f_exit.addActionListener(al);

        mi_e_cut.addActionListener(al);
        mi_e_copy.addActionListener(al);
        mi_e_paste.addActionListener(al);
        mi_e_delete.addActionListener(al);

        mi_h_help.addActionListener(al);
        mi_h_about.addActionListener(al);

        m_code.addActionListener(al);
    }

}

我的目标是使 JButton 看起来像一个 JMenu。这意味着该按钮仅在我与 JMenuBar 的其余部分交互时才改变颜色,而不仅仅是当我将鼠标悬停在它上面时。例如,如果我单击了 JMenum_file然后将鼠标悬停在 JButton 上,背景会发生变化,但是,如果我之前没有与 JMenuBar 交互,那么当我将鼠标悬停在 JButton 上时,背景不应更改。接下来需要的是 JMenuBar 将其视为 JMenu。我的意思是当F10单击 并选择第一个 JMenu。之后您可以单击键盘上箭头键盘上的向右箭头,这将选择下一个 JMenu。但是,使用这种导航方法会跳过 JButton,并且不允许您以任何方式与 JButton 进行交互。我的意思还在于,如果您与 JMenu 交互,然后将鼠标悬停在 JButton 上,JMenuBar 会显示您仍然将鼠标悬停在 JMenu 上(参见图片)。

所以我想我有三个问题。

  1. 如果已经与 JMenuBar 进行交互,如何使 JButton 仅更改颜色?

  2. 如何让 JMenuBar 将 JButton 视为我所描述的意义上的 JMenu?

  3. 当您将鼠标悬停在 JMenu 上时,有人知道 JMenu 背景的确切颜色吗?因为我更愿意将 JButton 的背景更改为与 JMenu 背景相同的颜色,而不仅仅是红色。

Thanks,

Dan


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 JButton 表现得像 JMenu 的相关文章

  • 是什么使得 java 中的枚举不可实例化?

    我知道一个枚举 enum Year First Second Third Fourth 被转换成 final class Year extends Enum
  • Java中构造函数中的长参数列表[重复]

    这个问题在这里已经有答案了 可能的重复 重构具有太多 6 个以上 参数的方法的最佳方法是什么 https stackoverflow com questions 439574 whats the best way to refactor a
  • Maven 管理的 Java EE 应用程序中 JBoss 提供的库

    这对我来说实际上不太可能 但网上似乎没有关于将 JBoss 提供的依赖项导入 Maven 管理的 Java EE 应用程序以在其中部署的直接答案 据我所知 有两件事与这个问题有关 那就是jboss as client外部 就 JVM 而言
  • 使用祖父母接口的默认方法

    我完全不明白为什么这行不通 interface Test default void doMagic System out println Abracadabra class TestImpl implements Test class Sp
  • Java 中的 sscanf 等效项[重复]

    这个问题在这里已经有答案了 可能的重复 用于使用已知模式解析字符串中的值的 sscanf 的 Java 等效项是什么 https stackoverflow com questions 8430022 what is the java eq
  • 确定范围是否重叠

    给定两个具有整数开始时间和结束时间的事件 E1 s1 e1 E2 s2 e2 实现快速布尔检查以查看事件是否重叠 我有解决方案 但我很想看看其他人想出了什么 编辑 好的 这是我的解决方案 e1 gt s2 s1 gt s2 e2 lt s1
  • Android 中的 ImageView 拖动限制

    我在布局中有一个 ImageView 并在 ImageView 上设置 OnTouchListener 来拖动 ImageView 它工作得很好 我的问题是如何防止将 ImageView 移动到布局范围之外 这是我的代码 活动类别 publ
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • 适当支持不区分大小写的映射

    我想实现一个不区分大小写的哈希映射 这个问题本身并不新鲜 但我想添加额外的功能 但不知道要采取什么总体方向 我希望客户能够做这样的事情 boolean preserve case true Map
  • 如何正确安装mysqlconnecter java?

    上网冲浪后 我意识到我应该在系统环境变量中设置类路径连接器 jar 文件的路径文件我这样做了 并在命令行中输入此命令我有这个 C Users User gt echo classpath D classpath mysql connecto
  • 将 JAR 文件打包为 WAR 文件

    我有一系列依赖的Java项目 我想将它们打包成一个 JAR 文件 以便在我的 WAR 文件中使用 这些项目依赖于大量的外部库和项目 如log4j apache commons等 我选择 Eclipse 中的所有项目并导出为 JAR 文件 然
  • 与 Java 中的同步块相比,新的 Lock 接口有什么优势?

    与 Java 中的同步块相比 新的 Lock 接口有什么优势 您需要实现一个高性能缓存 允许多个读取器但单个写入器保持完整性 您将如何实现它 锁的优点是 让他们公平是可能的 可以使线程在等待 Lock 对象时响应中断 可以尝试获取锁 但如果
  • Cordova Android 应用程序中的网页不可用

    编辑 我一直在解决这个问题并回顾我的所有步骤 我很乐意缩小这个问题的规模 并在令人困惑的情况下获得更多确切的细节 目前 我觉得 Keycloak 似乎只想将我重定向到 https 据我所知 这应该是 Wildfly 服务器配置问题 编辑 我
  • 如何从 Java 类调用 Kotlin 类

    我需要将意图从 java 活动传递到 Kotlin 活动 Java活动ProfileActivity class Intent selectGameIntent new Intent ProfileActivity this kotlin
  • FEST-swing 示例不起作用,frame.isShowing() 返回 false

    尝试使用 FEST Swing 进行 Swing GUI 测试 并使用来自http easytesting org swing wiki pmwiki php n FEST Swing LaunchFromMain http easytes
  • 在 init 之外在 java 中创建对象

    因此 对于我正在创建的游戏 我有一些扩展 GameDriver 的类 到目前为止 在所有其他类上我都能够扩展 GameDriver 然后在 GameDriver 中我可以执行以下操作 ArrayList
  • 如何将 JAVAX-WS 端点绑定更改为 SOAP 1.2?

    我正在使用发布测试 WS 实现Endpoint publish 用于在 Visual Studio 中使用 根据文档 http metro java net nonav 1 2 docs endpoint html默认的 SOAP 绑定是1
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • 在 Eclipse Testrunner 中使用名称的 ParameterizedTest

    当您使用 Eclipse TestRunner 运行 JUnit 4 ParameterizedTest 时 图形表示相当愚蠢 对于每个测试 您都有一个名为 0 1 ETC 是否可以进行测试 0 1 等显式名称 实施一个toString测试
  • 我可以在方法体内使用注释吗?

    允许 Java 注释的语义将它们放置在某处在函数体内 例如注释特定的函数调用 语句或表达式 例如 class MyClass void theFunc Thing thing String s null Catching NullPoint

随机推荐

  • Asp.NET Core 2.1 HostedService - 继续在 Azure 上运行

    我们有一个使用 IHostedService 的 Web 应用程序 有一个这样的例子here https gist github com davidfowl a7dd5064d9dcf35b6eae1a7953d615e3 我们采用的方法是
  • 在 OS X 上初始化 D 运行时

    编辑 这似乎是一个长期存在的问题 没有迫在眉睫的解决方案 http d puremagic com issues show bug cgi id 8133 http d puremagic com issues show bug cgi i
  • Joda-Time:DateTime、DateMidnight 和 LocalDate 的使用

    乔达时间 http www joda org joda time 库包含不同的日期时间类 DateTime http www joda org joda time apidocs org joda time DateTime html 不可
  • 嵌入模式给出错误

    我试图将模式嵌入到我创建的其他模式中 但我不断收到此错误 我不完全确定这里出了什么问题 但我想要做的是将我的事件模式和兴趣模式的引用存储在用户模式内 如果有人能告诉我我做错了什么 那就太好了 谢谢 编辑 我现在收到一个新错误 Users D
  • Django:如何检查用户名是否已经存在?

    我不是 Django 的高级用户 我在网上看到了很多不同的方法 但它们都是针对修改模型的 或者太复杂 我无法理解 我正在重复使用UserCreationForm in my MyRegistrationForm class MyRegist
  • “this”关键字在 Nodejs 和浏览器中的行为不同

    我有这段代码 var obj1 var obj2 function x obj1 this function y obj2 this x y console log obj1 obj2 console log obj1 this 我使用命令
  • NSSavePanel 在沙箱应用程序后不保存文件

    我在保存字符串文件时遇到问题NSSavePanel将应用程序沙箱到 Mac App Store 后 我设置com apple security files user selected read write to YES和NSOpenPane
  • PHP:致命错误:调用非对象上的成员函数[重复]

    这个问题在这里已经有答案了 在这里遇到一个非常奇怪的错误 我正在编写一个平面文件数据库类 这一切都工作正常 直到我刷新 现在我不断收到此消息 致命错误 调用非对象上的成员函数 name home reithg public html tes
  • AVD 管理器 - 无法再运行多个模拟器

    我知道 AVD 管理器可以运行多个模拟器 但在过去几天的新版本中 它停止了工作 它不再执行启动 4 个命令提示符窗口的操作 并且只有一个加载栏 但现在我无法同时运行 1 个以上的命令提示符窗口 当我单击开始时 加载栏完成 但没有加载模拟器
  • 授予 NTFS 权限时继承的权限丢失

    我试图为特定用户授予 UNC 路径上的 NTFS 权限 但我看到不同的行为取决于 UNC 路径 下面是代码 来自MSDN http msdn microsoft com en us library c1f66bc2 aspx 我用它来授予权
  • “flutter packages get”和“flutter pub get”有什么区别?

    我刚刚升级 Android Studio 并看到flutter packages get变成flutter pub get在 工具 gt 颤振 中 这在功能上有什么变化吗 或者它们完全一样吗 他们都做同样的事情 为了证明这一点 我创建了两个
  • Pinterest API 搜索不再工作

    我正在寻找 pinterest API 端点 我已经找到了一些网址 https api pinterest com v3 domains
  • Python selenium 将键发送到文本区域

    我正在使用 Python 3 4 4 访问网站 https readability score com https readability score com 有一个文本区域 当添加新值时会动态更新 我正在尝试将字符串输入到该文本区域框中
  • @EnableAspectJAutoProxy 不起作用

    我正在使用 Spring Boot 并且我想将 AspectJ 与它一起使用 以下作品 当然 Aspect Component public class RequestMappingAspect Before annotation org
  • 创建带有框字符的控制台菜单

    我已经构建了一个菜单 但我想将其格式化为如下所示 菜单标题位于框中 选项位于框中 我找到了来自的盒子字符http en wikipedia org wiki Box drawing character http en wikipedia o
  • 是否有Python内置函数可以确定可迭代对象是否包含特定序列?

    例如 类似 gt gt gt 1 2 3 contains sequence 1 2 True gt gt gt 1 2 3 contains sequence 4 False 我知道in运算符可以对字符串执行此操作 gt gt gt 12
  • 如何在禁用的控件上显示工具提示?

    我正在显示按钮列表 其中一些可能被禁用 我需要在禁用按钮上显示工具提示 并解释其禁用原因 但似乎我无法在不禁用工具提示的情况下禁用该按钮 有没有一个简单的方法可以解决这个问题 将按钮包装在一个组中 然后将工具提示应用到该组
  • 根据 Pandas DataFrame 中的其他列值在列之间移动行值

    我有一个熊猫数据框 其中包含生物体名称及其抗生素敏感性列表 我希望根据以下规则将所有生物体合并到下面数据框中的一列中 如果 ORG1 A 则不执行任何操作 如果 ORG1 A 且 ORG2 A 则将 ORG2 值移至 ORG1 列 如果 O
  • 绘制振幅

    我想知道是否有人可以向我指出一个好的教程或向我展示如何绘制字节数组的幅度图 我使用的音频格式是 U LAW 8000 0 Hz 8 位 单声道 1 字节 帧 听起来您对短期平滑 RMS 幅度测量感兴趣 通常 要执行此操作 您需要输入信号的整
  • 使 JButton 表现得像 JMenu

    我有以下 JMenuBar 代码 此代码取自免费的 java 程序调用JGuiD https sourceforge net projects jguid 并出于个人目的进行编辑 import javax swing import java