使用 JLayeredPane 创建棋盘游戏布局

2024-03-06

我有一项任务要求我创建您在图像中看到的布局,作为游戏开发的一部分。我以前从未在桌面应用程序中使用过 Java,因此在使用 Swing 和 AWT 库方面我完全是个菜鸟。该图像建议我们使用 JLayeredPane 作为根容器,然后将其余部分添加到其顶部。我的问题是,我尝试从背景图像和 gridLayout 开始,但我似乎无法显示除背景之外的任何内容。网格根本不显示(没有边框线,没有单元格背景),并且我添加到其中的任何其他组件都失败了。有人能在这里指出正确的方向吗?我已经阅读了文档并看到了各种布局、容器和组件的一些示例,但我似乎无法让它们一起工作。

到目前为止,这是我的代码:

public class BoardView  extends JFrame{


// Constructor
public BoardView() {
    JFrame window = new JFrame("Sorry Game"); // create a new Jwindow instance
    ImageIcon appIcon = new ImageIcon(getClass().getClassLoader().getResource("res/icon.png")); // create the icon for the app
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // when the 'X' button is clicked, the app stops
    window.setSize(new Dimension(1000, 700)); // setting the size of the window
    window.setResizable(false); // Window won't be resizable
    window.setIconImage(appIcon.getImage()); // set the icon for the app
    window.setLayout(new BorderLayout());
    JLayeredPane layeredPane = new JLayeredPane();
    JLabel background = new JLabel();
    background.setSize(1000,700);
    background.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/background.png")));  for the JLabel
    layeredPane.add(background,0);

    JPanel gridPanel = new JPanel(new GridLayout(16,16));
    gridPanel.setSize(650,700);
    layeredPane.add(gridPanel);

    for(int i = 0; i < 256; i++) {
        JLabel tile = new JLabel();
        tile.setBackground(Color.red);
        tile.setBorder(new LineBorder(Color.black));
        gridPanel.add(tile);
    }

    JLabel logo = new JLabel();
    logo.setIcon(new ImageIcon(getClass().getClassLoader().getResource("res/sorryImage.png")));
    layeredPane.add(logo);
    window.add(layeredPane);
    window.setLocationRelativeTo(null); // centers the window to the screen
    window.setVisible(true); // make the window visible
}
}

我的思考过程是,我可以将 JFrame 的布局设置为 BorderLayout,以便我可以将最终布局分为两部分,西部分和东部分。西边的一个将包含网格以及各种 JLabel 和按钮,东边的一个将包含其余组件。我尝试过使用BorderLayout.WEST & EAST向 JFrame 添加组件时的参数,但没有一个起作用或改变任何事情。当按照文档将组件添加到 JLayeredPane 时,我还尝试使用深度索引,但同样没有任何变化。

附:请注意,我并不是在找人为我创建布局。我希望有人帮助我了解我做错了什么以及创建此类布局的最佳方法是什么。


为了初始化我想要在其中包含图像的网格单元格,我不需要将它们手动添加到这些位置吗?

如果您使用GridLayout每个单元都必须有一个组件,并且组件必须按顺序添加。也就是说,当添加组件时,它们将根据需要自动换行到下一行。

因此,即使您不想在单元格中添加图像,您也需要添加一个虚拟组件,例如没有文本/图标的 JLabel。

更简单的方法可能是使用GridBagLayout. The GridBagLayout可以配置为没有组件的单元“保留”空间。因此您可以将组件添加到特定单元格。

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

public class GridBagLayoutSparse extends JPanel
{
    public GridBagLayoutSparse()
    {
        setBorder( new LineBorder(Color.RED) );

        GridBagLayout gbl = new GridBagLayout();
        setLayout( gbl );
/*
    //  Set up a grid with 5 rows and columns.
        //  The minimimum width of a column is 50 pixels
        //  and the minimum height of a row is 20 pixels.

        int[] columns = new int[5];
        Arrays.fill(columns, 50);
        gbl.columnWidths = columns;

        int[] rows = new int[5];
        Arrays.fill(rows, 20);
        gbl.rowHeights = rows;
*/
        //  Add components to the grid at top/left and bottom/right

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        gbc.gridx = 0;
        gbc.gridy = 0;
        addLabel("Cell 0:0", gbc);

        gbc.gridx = 3;
        gbc.gridy = 4;
        addLabel("Cell 3:4", gbc);
    }

    private void addLabel(String text, GridBagConstraints gbc)
    {
        JLabel label = new JLabel(text);
        label.setBorder( new LineBorder(Color.BLUE) );

        add(label, gbc);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("GridBagLayoutSparse");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout( new GridBagLayout() );
        frame.add(new GridBagLayoutSparse());
        frame.setSize(300, 300);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}
  1. 按原样运行代码,组件将在中心分组在一起。
  2. 取消注释块注释并再次运行。这些组件将被放置在适当的单元格中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JLayeredPane 创建棋盘游戏布局 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 使用VBA从网站上的表格中检索标签并放入Excel中

    我正在尝试从以下位置检索信息 td 网站上的标签 它有效 但我似乎无法从第二个中获取文本 td 标签在一个 tr 标签 同时使用条件语句来获取第二个标签 因为这是我认为有效的唯一方法 该代码可以很好地提取信息 我只是不知道如何在我在第一个中
  • TypeScript - 将布尔值作为 void 函数返回的函数

    如示例中所示 如果我有一个 void 函数的类型定义 则返回布尔值的函数将通过该类型检查 这是一个错误还是有正当理由 有解决方法吗 type ReturnsVoid gt void type ReturnsNumber gt number
  • Keras Convolution2D 输入:检查模型输入时出错:预期 volution2d_input_1 具有形状

    我正在努力通过这个很棒的教程 https blog keras io building powerful image classification models using very little data html关于使用 Keras 创
  • Python-用另一个单词替换单词[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有 12 个单元格的 html 表格 每个单元格都有一个要替换的单词 所有的词都是相同的 我还有一个包含 12 个元素的列表 每个元
  • 如何在 C# WEB API 中返回 JSON Web 令牌?

    我正在尝试使用 JWT 来保护用 C 编写的 WEB API 但我对一些事情感到困惑 根据我的理解 流程应该是这样的 客户端从某些客户端应用程序 Angular NET Mobile 等 向 Web API 提供用户名 密码 Web API
  • 哪种传感器适合旋转 Android 手机?

    想象一下你指着电视 您手里紧握着手机 现在 旋转手腕 我需要使用哪个传感器来检测这样的运动 陀螺仪 方向 加速度计 传感器TYPE MAGNETIC FIELD and TYPE ACCELEROMETER可以很好地检测到这一点 如TYPE
  • PySide:QPushButton 按下后保持突出显示

    在我的工具中 当用户按下按钮时 会创建一个弹出窗口 我的问题是 用户按下打开窗口的按钮在弹出窗口创建时保持突出显示 就像我将鼠标悬停在它上面一样 并且即使在弹出窗口被删除后仍然保持这种状态 我实际上喜欢弹出窗口处于活动状态时的此突出显示 它
  • 相当于 ASP.NET 中的 ASP.NET MVC TempData

    在 ASP NET MVC 中 有一个 TempData 可以将数据一次从一个页面传递到另一页面 在 ASP NET 中这相当于什么 没有直接的等效项 即仅传递到下一页的数据 您可以使用Session并在接收页面将其清除
  • 保存/提交时重新加载 jqGrid

    我有以下代码可以在双击时进入内联编辑 ondblClickRow function row id if row id null Products jqGrid restoreRow last selected row Products jq
  • 在 Javascript 中模拟 window.location.href

    我对一个使用 window location href 的函数进行了一些单元测试 这并不理想 我宁愿将其传递进去 但在实现中这是不可能的 我只是想知道是否可以模拟这个值而不实际导致我的测试运行器页面实际转到该 URL window loca
  • 对于此场景,在 SQL 中连接多个表

    这是我的表结构 我有3张桌子 会员表 评论表 评论如表 表结构可以在下图中找到 表 会员 user id full name email password image join date 表 专辑 评论
  • 使用Python/Boto/Django构建策略直接上传到S3

    到目前为止 我已经经历了这个问题的多次迭代 搜索了许多不同的示例 并且已经阅读了所有文档 我正在尝试结合 Plupload http www plupload com http www plupload com 与 AWS S3 直接发布方
  • 带有用户输入和选择变量的 Jenkinsfile

    我想使用新的 Jenkinsfile 来完成新的工作 我有 jenkinsfile 它位于单独的存储库中 我从另一个 GitLab 存储库获取分支git ls remote在bash中 我将它们存储在变量中 branch1 branch2
  • Ionic 3 - cocoapods 的 xcode 错误

    我尝试构建一个带有推送通知的 ionic 3 应用程序 但我在 iOS 部署方面遇到了一些问题 我在 xcode 中遇到了 3 个错误 diff Podfile lock No such file or directory diff Man
  • 为什么 GHC 使修复变得如此令人困惑?

    查看 GHC 源代码我可以看到定义fix is fix a gt a gt a fix f let x f x in x 在一个例子中fix像这样使用 fix f x gt let x x 1 in x f x 这基本上会产生一系列加一到无
  • 支持索引视图的会话设置

    我在数据库中使用索引视图 因此客户端应该有一些会话连接设置来调用它们 我正在使用 ado net 连接 命令调用存储过程 每次我必须调用存储过程时 我都会创建连接 我希望连接池允许我快速完成此操作 并执行命令以将这些设置应用到当前连接 so
  • 如何在 Android Studio 中显示行号[重复]

    这个问题在这里已经有答案了 我正在发布 如何在 Android Studio 中显示行号 的快速参考 请参阅下面的答案 注意 这个问题已被标记为重复 因为 Android Studio 基于IntelliJ http blog jetbra
  • 相同的字体在 Chrome 与 Firefox、IE 和 Safari 中看起来不同

    该问题与在不同浏览器中呈现字体有关 我很惊讶地发现这个问题只在 Chrome 中重现 它在 Firefox IE8 Safari 甚至 IE6 中运行良好 样品来了 这是代码本身 div style padding top 1px widt
  • ReactJS:使用 useState 管理多个复选框输入

    我有以下示例组件 它使用多个复选框来选择要从对象列表中删除的项目 import React useState from react import styles css const data name test1 result pass na
  • 使用 JLayeredPane 创建棋盘游戏布局

    我有一项任务要求我创建您在图像中看到的布局 作为游戏开发的一部分 我以前从未在桌面应用程序中使用过 Java 因此在使用 Swing 和 AWT 库方面我完全是个菜鸟 该图像建议我们使用 JLayeredPane 作为根容器 然后将其余部分