使 JButton 重叠

2024-04-08

我正在 Java Swing 中创建一个虚拟钢琴类型程序。我现在的钢琴键区域是一个带有水平 BoxLayout 的 JPanel,其中包含白色 JButton 作为白键。我还想添加黑键,并让它们与白键重叠。

我尝试过两种不同的方法。一种是使用 OverlayLayout。遗憾的是,关于 OverlayLayout 管理器的在线文档并不多,而且 NetBeans GUI 构建器中也没有提供该文档。我不知道如何让它发挥作用。我尝试的第二件事是使用 JLayeredPanes。即使在 Netbeans 中搞乱了它之后,我似乎也无法弄清楚这一点。

所以我认为我的问题很简单。如果有的话,将 JButton 添加到其他 JButton 之上的最佳方法是什么?或者也许还有使用 JButtons 作为钢琴键的替代方法?

EDIT

我结合了 aioobe 和 dacwe 的代码来得到我想要的结果。我基本上使用了 dacwe 的 z 排序和 aioobe 的基本尺寸(稍微放大了一点)以及 mod 7 部分。我还添加了一些变量以使事情更加清晰。这就是我现在所拥有的。

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

public class Test2 {

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    JLayeredPane panel = new JLayeredPane();
    frame.add(panel);

    int maxKeys = 8;

    int width = 60;
    int height = 240;

    for (int i = 0; i < maxKeys; i++) {
        JButton b = new JButton();
        b.setBackground(Color.WHITE);
        b.setLocation(i * width, 0);
        b.setSize(width, height);

        panel.add(b, 0, -1);
    }

    int width2 = 48;
    int height2 = 140;
    for (int i = 0; i < maxKeys; i++) {
        int j = i % 7;
        if (j == 2 || j == 6)
            continue;

        JButton b = new JButton();
        b.setBackground(Color.BLACK);
        b.setLocation(i*(width) + (width2*3/4), 0);
        b.setSize(width2, height2);

        panel.add(b, 1, -1);
    }

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500,280);
    frame.setVisible(true);
    }
}

多谢你们!现在我需要以某种方式将侦听器和文本附加到这些按钮。


我会写一个自定义PianoLayoutManager并将黑键放置在比白色按钮更高的 z 顺序上。创建您自己的“约束”类,允许您添加如下组件:

add(new WhiteKey(), new PianoLayoutConstraint(WHITE, 1);
add(new WhiteKey(), new PianoLayoutConstraint(WHITE, 2);
...
add(new WhiteKey(), new PianoLayoutConstraint(WHITE, n);

add(new BlackKey(), new PianoLayoutConstraint(BLACK, 1);
add(new BlackKey(), new PianoLayoutConstraint(BLACK, 2);
...
add(new BlackKey(), new PianoLayoutConstraint(BLACK, m);

From 使用 Swing 组件教程 http://download.oracle.com/javase/tutorial/uiswing/components/jcomponent.html

Note:z 顺序决定了组件绘制的顺序。 z 顺序最高的组件首先绘制,z 顺序最低的组件最后绘制。当组件重叠时,具有较低 z 顺序的组件将绘制在具有较高 z 顺序的组件之上。

这是一个丑陋的黑客,它使用空布局来帮助您入门。

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

class PianoComponent extends JPanel {

    PianoComponent() {

        setLayout(null);

        for (int i = 0; i < 20; i++) {
            JButton key = new JButton();
            key.setBackground(Color.WHITE);
            key.setLocation(i * 20, 0);
            key.setSize(20, 120);
            add(key);
            setComponentZOrder(key, i);
        }

        for (int i = 0; i < 20; i++) {
            int j = i % 7;
            if (j == 2 || j == 6)
                continue;

            JButton key = new JButton();
            key.setBackground(Color.BLACK);
            key.setLocation(i * 20 + 12, 0);
            key.setSize(16, 80);
            add(key);
            setComponentZOrder(key, 0);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        JFrame jf = new JFrame("Piano!");
        jf.setSize(400, 200);
        jf.add(new PianoComponent());
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 JButton 重叠 的相关文章

  • 声纳违规:安全性 - 使用 byte[] 时直接存储数组

    我确实遇到过以下两篇关于类似问题的帖子声纳违规 https stackoverflow com questions 11580948 sonar violation security array is stored directly and
  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 谁能解释一下 servlet 映射吗?

    我正在尝试使用 SpringMVC 编写一个 Web 应用程序 通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活 但这次我要使用类似 REST 的 URL 没有文件扩展名 将我的上下文路径下的所有内容映射到前端
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • Java 中意外的负数

    import java util public class Prac9FibonacciNumbers public static void main String args int x new int 100 x 0 1 x 1 1 fo
  • 将传入字符串的 unicode 表示形式转换为 UTF-8?

    我正在读取一些已经转换为 html 样式 代码的数据 我现在需要将其转换回 UTF 8 字符以供查看 不幸的是我无法使用浏览器查看该字符串 我读过有关 java 中的转换的内容 似乎如果你有一个 uxxxx 字符串 那么编译器会为你转换 然
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • Maven `help: effective-pom` 只为单个项目生成,而不是所有项目

    我想为多模块构建中的所有子项目生成有效的 pom The help effective pom文档here http maven apache org plugins maven help plugin usage html The hel
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s
  • 如何正确使用Google Calendar API Events.Insert命令?

    所以我一直使用REST方法来调用Google的API 我需要将事件插入到我拥有 ID 的特定日历中 这是我发送的 POST 请求 地址 https www googleapis com calendar v3 calendars https

随机推荐

  • 从 gwt 中的代码触发点击事件

    我在 gwt 中创建了一个自定义小部件 它扩展了复合材料 我正在其中使用焦点面板 对于 FocusPanel 我添加了 ClickHandler 然后我添加了键盘监听器 现在按 Enter 键 它应该触发单击事件 任何人都可以提供帮助吗 我
  • Objective-C 运算符 (?) 和 (:)

    做什么的 and 这里表示 define MAX a b a gt b a b 这是一个三元运算符 http en wikipedia org wiki Ternary operation 也可用于 C 语言 Objective C 是 C
  • 如何在 geom_tile ggplot 中移动图块右/左端的刻度线和标签?

    我无法将 geom tile 中的 x 轴标签 包括刻度线 移动到每个图块的右端 我还想在左端添加零 我尝试过休息和标签 但没有运气 使用中断和标签也不起作用 我试图实现这个答案中所做的事情 但建议的解决方案不起作用 如何强制 x 轴刻度线
  • 如何将 $_GET 路径与 file_exists 一起使用并保证其安全?

    我有一个函数可以通过 jQuery 检查文件是否存在 该函数调用 PHP 脚本 在单击索引页面上的按钮更改某些图像时将使用该脚本 jQuery 函数 function fileExists path getJSON ajax fileExi
  • 标准化 sql server 中迄今为止不同格式的 varchar 字段

    我知道过去曾被问过类似的问题 但他们仍然没有为我的案例提供适当的解决方案 我有一个数据库表 第三方 其中有varchar列为datetime value 它包含以下格式的日期 11181980 8 18 1960 10 01 1960 04
  • 如何在 sbt 中为我的项目设置系统属性?

    我确信我错过了一些非常简单的东西 我想设置系统属性java awt headless to true对于我的 sbt 项目 正在阅读属性页面 http code google com p simple build tool wiki Pro
  • 如何在pyspark中分解数据框的多列

    我有一个数据框 其中包含类似于以下内容的列中的列表 所有列中列表的长度不相同 Name Age Subjects Grades Bob 16 Maths Physics Chemistry A B C 我想以这样的方式分解数据框 以获得以下
  • Objective-C 和 Cocoa 有什么区别?

    我正在学习 Mac 上的 Objective C Cocoa 编程 我一直使用的所有教程 书籍 博客 播客等实际上都涵盖了这两者 有没有一种简单的方法来区分哪些部分是普通的 Objective C 哪些部分来自 Cocoa Objectiv
  • 从具有不同列数的两个表中选择 *

    我如何从两个不同的表中选择不同的列 例如 SELECT username email FROM table1 UNION SELECT FROM table2 WHERE username user1 我收到错误 1222 The used
  • 在 Mac 上安装 numpy 以在 AWS Lambda 上运行

    有没有办法安装numpy在 Mac 上 以便上传到 AWS Lambda 后可以正常工作 我尝试过各种不同的方法 包括使用不同的方法pip版本 使用easy install 和以下这个帖子 https stackoverflow com q
  • 由于随机给定的字符,我无法从 firebase 更新数据

    这是我的 firebase 我不知道如何在 firebase 中输入或获取该路径 我想更改该随机字符内的密码 要更新数据库中的特定值 您必须知道该值的完整路径 如果您知道电子邮件地址 但不知道该电子邮件地址的键 则可以使用查询来查找该电子邮
  • 如何从div中获取innerHTML?

    我需要保存 div 的 innerHTML 并将其存储在 cookie 中 这是我的基本代码 The div saving function function addStatus sName getElement bottomDiv inn
  • 以编程方式确定远程桌面协议版本?

    远程桌面协议版本 6 1 更改了 RDP 会话的处理方式 将会话 0 以前表示 控制台会话 更改为非交互式会话 我需要能够从我的程序中弄清楚如何确定当前 RDP 会话正在使用哪个版本的 RD 协议 然而 我在 Windows 终端服务 AP
  • 通过 shell 脚本从文件中读取值并将值放入 WHERE 子句中

    外壳脚本 bin bash sqlplus s
  • 如何在 osx 机器上安装要在 php 中使用的“语言环境”?

    我正在开发一个需要多语言支持的网站 我正在尝试在 php 中使用语言环境 但某个语言环境 es CO 在我的开发计算机中不可用 它位于我的托管服务器上 我研究了如何添加新的区域设置 但找不到如何或在哪里获取新的区域设置文件 它应该安装在操作
  • 方法存在时出现 Java NoSuchMethodError

    我正在参考PlayerUtil getMovementSpeed player 在我的 Speed 类和 PlayerUtil 类中 我将方法定义为 public static double getMovementSpeed Player
  • Python pandas 在滚动日期窗口中最常见的值

    我有一个包含以下数据的 pandas 数据框 我想添加一个新列 对于每个日期 返回过去 3 天内最常出现的 weather type 如果结果是平局 我希望返回最近的 weather type d date 17 02 2017 18 02
  • 身份服务器流程

    IdentityServer 支持不同的 OpenId Connect 流 这些流定义在Flows https github com IdentityServer IdentityServer3 blob 4a44a9f03879c85bb
  • 如何在 ASP.NET MVC 4 中使用 Autofac 注入 HttpContextBase

    我在用ASP MVC 4 and Autofac 我已在我的中注册了以下内容global asax cs file ContainerBuilder builder new ContainerBuilder builder Register
  • 使 JButton 重叠

    我正在 Java Swing 中创建一个虚拟钢琴类型程序 我现在的钢琴键区域是一个带有水平 BoxLayout 的 JPanel 其中包含白色 JButton 作为白键 我还想添加黑键 并让它们与白键重叠 我尝试过两种不同的方法 一种是使用