使用鼠标和 Swing 绘制(单色)数组的最简单方法是什么?

2024-01-10

我一直在寻找一种在屏幕上绘制黑白数组的方法。这是一个简单的数组,只有 20x20。我计划做的是用鼠标在数组上绘制,以便每个像素在单击时从黑色“切换”到白色并返回,然后将数组作为一组布尔值(或整数)传递给另一个函数。目前我正在使用 Swing。我确实记得用过Swing在画布上绘图,但我仍然找不到实际用法。我应该使用画布,还是依赖 JToggleButtons?


您可以简单地使用JFrame(或其他 Swing 组件)并覆盖paint(Graphics)绘制布尔矩阵表示的方法(请注意,对于轻量级组件,例如JPanel你应该覆盖paintComponent(Graphics)。这将为您提供所需的单击和拖动功能(使用单个 Swing 组件的网格很难实现这一点)。

正如其他人评论的那样,AWTCanvas不会为您提供 Swing 组件未提供的任何内容,您将在下面的示例中看到我使用了createBufferStrategy方法也存在于JFrame以保证显示不闪烁。

请注意,我的示例相当简单,因为它会切换您拖动的每个像素,而不是确定您处于“绘画”模式还是“擦除”模式的单击操作,然后在拖动期间专门应用黑色或白色像素。

public class Grid extends JFrame {
    private static final int SCALE = 10; // 1 boolean value == 10 x 10 pixels.
    private static final int SIZE = 20;

    private boolean[][] matrix = new boolean[SIZE][SIZE];
    private boolean painting;
    private int lastX = -1;
    private int lastY = -1;

    public Grid() throws HeadlessException {
        setPreferredSize(new Dimension(SIZE * SCALE, SIZE * SCALE));
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBackground(Color.WHITE);

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                painting = true;
                tryAdjustValue(e.getPoint());
            }

            public void mouseReleased(MouseEvent e) {
                painting = false;
                lastX = -1;
                lastY = -1;
            }
        });

        addMouseMotionListener(new MouseMotionListener() {
            public void mouseDragged(MouseEvent e) {
                tryAdjustValue(e.getPoint());
            }

            public void mouseMoved(MouseEvent e) {
                tryAdjustValue(e.getPoint());
            }
        });
    }

    private void tryAdjustValue(Point pt) {
        int newX = pt.x / SCALE;
        int newY = pt.y / SCALE;

        if (painting && isInRange(newX) && isInRange(newY) && (newX != lastX || newY != lastY)) {
            // Only invert "pixel" if we're currently in painting mode, both array indices are valid
            // and we're not attempting to adjust the same "pixel" as before (important for drag operations).
            matrix[newX][newY] = !matrix[newX][newY];
            lastX = newX;
            lastY = newY;
            repaint();
        }
    }

    private boolean isInRange(int val) {
        return val >= 0 && val < SIZE;
    }

    public void paint(Graphics g) {
        super.paint(g);

        for (int x=0; x<SIZE; ++x) {
            for (int y=0; y<SIZE; ++y) {
                if (matrix[x][y]) {
                    g.fillRect(x * SCALE, y * SCALE, SCALE, SCALE);
                }
            }
        }
    }

    public static void main(String[] args) {
        Grid grid = new Grid();
        grid.pack();
        grid.setLocationRelativeTo(null);
        grid.createBufferStrategy(2);
        grid.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用鼠标和 Swing 绘制(单色)数组的最简单方法是什么? 的相关文章

  • openFileOutput 在单例类中无法正常工作 - 想法/解决方法?

    作为一名 Android 开发新手 我遇到了一些奇怪的问题 我想创建一个类 它方法其他类 活动 任何可以用于以某种特殊方式处理文件的类 假设为了简单起见 我们将记录一些内容 如果我在活动中执行以下操作 例如在 OnClick 侦听器中 则一
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 将数组复制到动态分配的内存

    我的代码可以正常工作 但我觉得好像有一种更快的方法可以做到这一点 特别是在我的函数副本中 这是我的代码 这能再快一点吗 顺便说一句 这是 C 语言 另外 当我从函数返回 cpy 时 它是否会删除动态内存 因为它超出了范围 我不想发生内存泄漏
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 在Python中将数组的元素从科学记数法转换为十进制记数法

    我有一个 numpy 数组 其元素采用科学格式 我想将它们转换为十进制格式 我的 numpy 数组如下所示 array 93495052 96955582 98555123 06146193 array 1 00097681e 09 9 9
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I

随机推荐

  • 使用 bitbake 进行分布式编译

    您知道如何使用分布式 bitbake 编译构建 oe 项目吗 我考虑过 distcc export PATH distcc bin PATH make jn CC linux gcc make 将从我的路径调用 linux gcc 该路径指
  • Matplotlib:--如何显示刻度上的所有数字? [复制]

    这个问题在这里已经有答案了 可能的重复 如何消除 matplotlib 轴的相对偏移 https stackoverflow com questions 11855363 how to remove relative shift in ma
  • 在 xyplot 下方绘制具有相同 x 轴的条形图?

    我试图在彼此下方绘制不同类型的图 线图和条形图 它们都具有相同的轴 c1 lt ggplot data aes date TotalMutObs stat smooth se FALSE geom point opts axis title
  • 如何在静态谷歌地图上添加高分辨率自定义标记

    我正在使用 Google 静态地图 文档在这里 http code google com apis maps documentation staticmaps 来显示商店的位置 我使用自定义标记而不是默认标记 然而 此标记图像在 iPhon
  • 环回 - 包括关系的计算属性

    我有一个环回应用程序 我希望能够在 API 调用中包含关系的计算属性 例如 假设我有一个apartment模型和一个address模型 这address有属性city and state 我想向公寓模型打一个电话 并将城市和州作为相关信息中
  • Materialize.css 从输入元素中删除样式

    我想让 Materialize css 卡在双击时可编辑 为此 我将输入放在卡片 div 中 而不是 p 中 div row each cards div col m4 s12 div card teal div card content
  • 用于打印 1-99 奇数的最有效代码 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 任务是将 1 到 99 的奇数打印在不同的行上 Codeeval 认为此代码部分正确 100 中的 98 已编辑 liszt i
  • 修改Http状态代码文本

    Question 如何修改状态代码文本 描述 标题 Example 例如 我想改变200 Ok to 200 My Custom Text 描述 我想创建一个带有自定义状态代码 未保留 431 的 HTTP 响应 我想修改它的文本 200
  • 从输入标签获取名称和值

    在你说 哦不 不再这样 之前 我先陈述一下我的情况 我正在解析 HTML 输出的一部分 我唯一感兴趣的是name and value每个的属性
  • 删除 androidx 首选项上的空白图标空间

    我刚刚将我的项目迁移到使用androidx图书馆 新的首选项 设置屏幕现在显示空的图标空间 如图所示here https developer android com guide topics ui settings organize you
  • 根据用户输入动态创建表

    我目前正在尝试使用 JS 和 HTML 动态创建一个表 但目前它似乎无法从用户输入中检索值 我做错了什么 提前致谢
  • 如何根据 XSD 文件验证 XML 文件?

    我正在生成一些 xml 文件 这些文件需要符合给我的 xsd 文件 我应该如何验证它们是否符合要求 Java 运行时库支持验证 上次我检查的是 Apache Xerces 解析器 你可能应该使用javax xml validation Va
  • Swift 将数组作为参数传递错误

    我刚刚开始使用 Swift 有人可以向我解释一下为什么我可以将数组作为参数传递 byRoundingCorners UIBezierPath roundedRect self bounds byRoundingCorners topLeft
  • Delphi在全局异常中的屏幕截图

    我正在开发一个组件 使用德尔福2006 该组件检索系统信息并写入文件 要求是我必须在组件中合并一个全局异常处理程序 因此当异常发生时它将被捕获并向用户显示我的自定义消息 procedure Tmy GlobalExceptionHandle
  • 在 C# 中通过节点名称和属性名称比较 XML

    我想通过标签名称和属性名称来比较两个 或更多 XML 文件 我对属性或节点的值不感兴趣 在 google 上搜索我发现 XMLDiff Patch http msdn microsoft com en us library aa302294
  • 如何在斯坦福 CoreNLP 服务器上使用自定义 TokensRegex 规则注释器?

    TokensRegex 规则颜色注释器 stanford corenlp full 2016 10 31 tokensregex color rules txt 通过命令行使用 CoreNLP 时加载成功 但对于 Web 服务器则失败jav
  • 如何将文件扩展名与 C# 中的当前可执行文件关联

    我想将文件扩展名与 C 中的当前可执行文件关联起来 这样 当用户随后在资源管理器中单击该文件时 它将使用给定文件作为第一个参数来运行我的可执行文件 理想情况下 它还会将给定文件扩展名的图标设置为我的可执行文件的图标 谢谢大家 似乎没有用于直
  • iOS 7 上的返回箭头

    我需要在我的应用程序中添加一个左栏按钮项目 它看起来像系统后退按钮 但不是系统后退按钮 因为它将出现在视图控制器上 这是我的 navController 堆栈的唯一 vc 并执行我自己的代码 简单地写 后退 对我来说并不是很好 因为我还需要
  • 如何消除除本地 Pod 之外的所有 Pod 的警告?

    我假设类似的事情 post install do installer Debug symbols installer pod project targets each do target target build configuration
  • 使用鼠标和 Swing 绘制(单色)数组的最简单方法是什么?

    我一直在寻找一种在屏幕上绘制黑白数组的方法 这是一个简单的数组 只有 20x20 我计划做的是用鼠标在数组上绘制 以便每个像素在单击时从黑色 切换 到白色并返回 然后将数组作为一组布尔值 或整数 传递给另一个函数 目前我正在使用 Swing