在java中绘制圆的切片?

2023-11-27

我想通过一个实心圆来表示一个计时器,该实心圆是在计时器的过程中逐段完全绘制的。 IE。如果在 4 秒计时器内每 1 秒填充一次圆圈,第一个将显示四分之一圆,然后是半圆,然后是四分之三,最后是一个完整的圆。

有没有办法在java中绘制这些圆的切片?我已经研究了图形 API 中的任意形状,但不确定这是否是正确的方法,或者是否有一些东西写入语言可以轻松生成这些类型的形状?

非常感谢任何帮助。


是的,这是可能的。是的,Graphics2D 有能力为您做到这一点

看一眼绘制几何基元(查找 Arc2D 部分)。

要“动画化”进度,最简单的方法可能是使用javax.swing.Timer,但您的要求可能需要您使用SwingWorker反而。看一下货币波动 and 如何使用 Swing 定时器了解更多信息。

下面的例子比较简单。它假定进度为 0-100%,并根据需要生成圆弧。这将是一个简单的问题,改变颜色Graphics2D上下文和使用draw(Shape)如果需要的话,可以画出圆的轮廓线。

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ArcProgress {

    public static void main(String[] args) {
        new ArcProgress();
    }
    private float progress;

    public ArcProgress() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final ArcProgressPane p1 = new ArcProgressPane();
                p1.setForeground(Color.RED);
                final ArcProgressPane p2 = new ArcProgressPane();
                p2.setForeground(Color.BLUE);
                p2.setFillProgress(true);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new FlowLayout());
                frame.add(p1);
                frame.add(p2);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        progress += 0.01f;
                        if (progress >= 1f) {
                            progress = 1f;
                            ((Timer) e.getSource()).stop();
                        }
                        p1.setProgress(progress);
                        p2.setProgress(progress);
                    }
                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();

            }
        });
    }

    public class ArcProgressPane extends JPanel {

        private boolean fillProgress = false;
        private float progress;

        public ArcProgressPane() {
        }

        public void setFillProgress(boolean value) {
            if (fillProgress != value) {
                this.fillProgress = value;
                firePropertyChange("fillProgress", !fillProgress, fillProgress);
            }
        }

        public boolean isFillProgress() {
            return fillProgress;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }

        public void setProgress(float value) {
            if (progress != value) {
                float old = progress;
                this.progress = value;
                firePropertyChange("progress", old, progress);
                repaint();
            }
        }

        public float getProgress() {
            return progress;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

            Insets insets = getInsets();
            int width = getWidth() - (insets.left + insets.right);
            int height = getHeight() - (insets.bottom + insets.top);
            int raidus = Math.min(width, height);
            int x = insets.left + ((width - raidus) / 2);
            int y = insets.right + ((height - raidus) / 2);

            double extent = 360d * progress;

            g2d.setColor(getForeground());
            Arc2D arc = null;
            if (isFillProgress()) {
                arc = new Arc2D.Double(x, y, raidus, raidus, 90, -extent, Arc2D.PIE);
            } else {
                extent = 360 - extent;
                arc = new Arc2D.Double(x, y, raidus, raidus, 90, extent, Arc2D.PIE);
            }
            g2d.fill(arc);
            g2d.dispose();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java中绘制圆的切片? 的相关文章

  • Excel 读取错误:标头签名无效。如何解决?

    我正在从浏览器上传一个 Excel 文件 我正在使用 POI jar 但出现错误 标头签名无效 读取 3255307777713450285 预期为 2226271756974174256 下面是我使用过的两个jsp文件 JSP 1
  • 无法在 IntelliJ IDEA 中导入 javax.validation.constraints

    I can t import that simple library i have all jar files also i tried Ivalidate Caches Restart Maybe i have to add valida
  • 如何在JNA中填充结构体数组?

    我正在尝试在 JNA 中使用以下 Windows API UINT WINAPI GetRawInputDeviceList Out opt PRAWINPUTDEVICELIST pRawInputDeviceList Inout PUI
  • 如何对文本文件执行二分搜索

    我有一个大文本文件 5Mb 我在 Android 应用程序中使用它 我将文件创建为预先排序的字符串列表 并且文件一旦创建就不会更改 如何对此文件的内容执行二分搜索 而不需要逐行读取来查找匹配的字符串 由于文件的内容不会改变 因此您可以将文件
  • 如何使用鼠标指针和键盘快捷键捕获文本?

    我想使用 C 或 java 使用鼠标指针和键盘快捷键从打开的窗口捕获文本 喜欢babylon http babylon com 所以 我需要知道什么以及如何实施 我需要使用哪些库 或者我可以使用 winapi 吗 使用脚本语言创建您想要执行
  • Java中无法到达的语句编译错误[重复]

    这个问题在这里已经有答案了 class For1 public static void main String args int a 0 for break System out println a Line 1 a Line 2 我知道第
  • 使用 Jackson 从 JSON 文件中删除空元素

    我正在尝试从 JSON 文件中删除一个元素 Lorem Ipsum 4 Lorem Ipsum 5 keyToRemove value 使用以下代码 我可以删除键和值 for JsonNode personNode rootNode if
  • 如果没有发生触摸事件,Android SurfaceView 会变慢

    我正在制作一款游戏 除了游戏循环之外一切都很顺利 我正在使用 SurfaceView 并绘制 2D Sprites 位图 目前游戏是一艘穿过小行星带的飞船 飞船停留在屏幕中央 手机向任一方向倾斜以移动小行星 小行星改变位置而不是玩家 当旧的
  • Java可以用来写Win32系统服务吗?

    标题有点概括了 我正在考虑使用Jabaco http www jabaco org因为它生成 EXE 以及 jar 文件 而且我对 VB 语法比对 Java 更熟悉 你当然可以用Java 服务包装器 http wrapper tanukis
  • 如何在 JPA/Hibernate 中找出实体是否分离?

    有没有办法查询JPA实体管理器给定实体是否分离 这个帖子 https stackoverflow com questions 2779857 how to know if a detached jpa entity has already
  • 当不读取带有 URL 的 QR 码时,zxing QRCodeReader 中出现 ChecksumException

    如果我扫描带有 URL 的 QR 码 以下代码可以完美且快速地运行 然而 如果我用简单的字符串或数字序列解码 QR 码 这就是我想要做的 它有时会随机工作 但 99 的情况下它会失败并出现 ChecksumException if webc
  • 将 float 转换为 Short,精度损失最小[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个生成浮点值 例如 0 37885 的正弦波 但我希望它们作为短裤 直接使用 Short 进行转换 得到的值为 0 那么解决方案是什么
  • 从批处理文件运行 .jar

    我已经创建了一个可执行文件 jar文件 我怎样才能执行 jar使用批处理文件而不提及类路径 在 Windows 上 您可以使用以下命令 start javaw jar JarFile jar 通过这样做 命令提示符窗口不会保持打开状态
  • 使用递归求数字之和

    对Java来说相当陌生 但我正在编写一个教程 其中我必须使用递归找到用户输入整数的数字总和 到目前为止 这是我的代码 公开课其他 public static void main String arg Scanner s new Scanne
  • Mac 上缺少 spring-boot-starter-web hibernate-validator 依赖项

    我在STS Spring工具套件 上创建了Spring Boot项目 Spring Starter Project Window和Mac都有 这是我的pom xml
  • 什么是运行时绑定?

    根据 Android 开发者指南 Intent 是一个提供运行时绑定独立组件之间 例如两个活动 什么是 运行时绑定 继承创建类型兼容性 它允许超类引用 引用子类的对象 反过来则不然 超类引用 指的是 子类的对象 只能用于 访问继承的和重写的
  • Java 让物体在按住按钮时移动

    如何使 JPanel 在按住按钮时移动并在释放按钮时停止 我尝试过将 thread start 与 Runnable 一起使用以及类似的方式 我总是遇到错误 有人可以帮助我吗 您需要考虑许多重要的因素 按钮的设计初衷并非如此 它们被设计为在
  • 线程完成时是否发出通知信号?为什么此代码示例有效?

    我正在寻找一些线索的谜题 但我不明白为什么以下内容始终打印999999 class Job extends Thread private Integer number 0 public void run for int i 1 i lt 1
  • HQL查询是否总是命中数据库并得到结果?

    我正在经历休眠以及何时使用的情况Criteria vs HQL我的理解是 使用 Hibernate 每次我们通过以下方式查询数据库时Criteria or HQL在这两种情况下 休眠都会获取结果集并放入内存中 然后当我们再次调用该查询时 将
  • 您可以链接两个 JFormattedTextField 的值吗?

    我有一个带有 2 个 JFormattedTextFields 的界面 我需要它们的值 不仅仅是显示的文本 相同 理想情况下 它们都应该是可编辑的 其中一个的更改会反映在另一个中 我一开始只是在两者之间共享一个文档 但很快就遇到了一个问题

随机推荐

  • Sklearn - 如何预测所有目标标签的概率

    我有一个包含目标变量的数据集 可以有 7 个不同的标签 我的训练集中的每个样本只有一个目标变量标签 对于每个样本 我想计算每个目标标签的概率 所以我的预测将由每行 7 个概率组成 在sklearn网站上我读到了有关多标签分类的内容 但这似乎
  • Windows 应用商店 - 拉伸图标

    我在 Windows 商店中遇到了一个小问题 我已在提交中上传了所有必需的图形 并且该应用程序具有所有必需的图形 包括框和平铺图像 然而 在商店中 应用程序入口使用的是宽图像 问题是它使用的宽图像实际上是一个被拉伸的框图像 有什么想法出了什
  • 使用 .NET SDK 按路径获取 Microsoft Graph Drive 项目

    因为它是有记录的 使用 Microsoft Graph REST API 您可以 以及其他选项 通过 ID 或路径获取项目 这工作正常 正如预期的那样 GET me drive items item id children GET me d
  • WPF:禁用列表框,但启用滚动

    整个早上我都在用头撞这个问题 基本上 我有一个列表框 我希望防止人们在长时间运行的过程中更改选择 但允许他们仍然滚动 解决方案 所有的答案都很好 我选择了吞咽鼠标事件 因为这是最直接的 我将 PreviewMouseDown 和 Previ
  • 加载 pandas 数据帧,其块大小由列变量确定

    如果我有一个太大而无法用 pandas 加载到内存中的 csv 文件 在本例中为 35gb 我知道可以使用 chunksize 分块处理该文件 但是我想知道是否可以根据列中的值更改块大小 我有一个 ID 列 然后每个 ID 都有几行包含信息
  • Twisted:等待子任务完成

    在我的代码中 我有两个假设的任务 一个从生成器获取 url 并使用 Twisted 的 Cooperator 批量下载它们 另一个获取下载的源并异步解析它 我试图将所有获取和解析任务封装到一个 Deferred 对象中 该对象在下载所有页面
  • 从 Django 直接输入数据以生成 D3 图

    似乎所有 D3 示例图都采用外部 csv 或 tsv 文件作为输入数据 有没有办法修改代码以从 Django 中的变量获取数据 假设 data 是 JSON 格式 如何在图表中实现它 例如http bl ocks org 3885304 o
  • 某些应用程序如何阻止/替换平视通知?

    背景 自从 Android 上出现平视通知以来 有些人喜欢它的快速处理 但有些人讨厌它显示在应用程序 尤其是游戏 顶部 为了显示抬头通知 开发人员可以使用类似的东西 final NotificationCompat Builder buil
  • 为什么没有 std::move_if 算法?

    我在互联网上看到过一些地方 他们描述了使用std copy if with std make move iterator 但如果迭代器是前向迭代器 则会导致有效但未指定的 VBU 对象分散在源容器周围 拥有一个不是更好吗std move i
  • 如何在asp.net c# 中统计网站的访问者数量

    如何统计asp net c 网站的访问者数量 我正在使用下面的代码 在 global asax 页面中 void Application Start object sender EventArgs e Code that runs on a
  • Array.Find 和 IndexOf 用于查找完全相同对象的多个元素

    我无法获取完全相同对象的多个元素的当前元素的索引 b A D B D C E D F b contains D 替代版本 b A D B D C E D F Array FindAll b Predicate String args 0 c
  • BPMS 还是只是简单的编程?

    在实现业务流程时 您更喜欢什么 从开发人员的角度来看 业务流程管理系统 BPMS 还是您最喜欢的带有所需工具和框架 例如报告工具 的 IDE 从您的角度来看 与具有您个人工具和框架的 IDE 相比 BPMS 的最大好处是什么 好的 也许我应
  • Python Pandas,应用函数

    我正在尝试使用 apply 来避免iterrows 函数中的迭代器 然而 pandas 方法的记录很少 我找不到如何使用它的示例 除了蹩脚的 apply sq rt 在文档中 没有关于如何使用参数等的示例 不管怎样 这里有一个关于我尝试做的
  • 如何将 git-replace 推送到远程仓库?

    我使用 git Replace 来替换分支 没有共同祖先 22b2b25 来替换 master 中的提交 我希望这种改变是永久性的 我对以前的历史不感兴趣 在下面的输出中 前 5 个提交来自原始 master 分支 后 2 个来自不同的分支
  • appengine-maven-plugin 配置选项,例如 jvm 标志

    从1 7 4版本开始 Google App Engine 的官方 appengine maven plugin 是由 Google 发布的 它有一个任务 appengine devserver 来启动本地开发服务器 这个插件似乎没有任何 M
  • 带有 Kubernetes 客户端插件的 Jenkins - NoSuchMethodError

    将 jenkins 插件 Kubernetes Client 升级到版本 1 30 3 也适用于 1 31 1 后 当我开始构建时 我在 jenkins 日志中收到以下异常 Timer task org csanchez jenkins p
  • 删除流星身份验证的登录令牌

    我不确定以前是否有人问过这个问题 但是loginTokens变得非常大并且没有任何清理会使我的数据库大小增加 对此我们正在做什么 其他人正在做什么来管理这个问题 我指的是默认的Meteor users services其中有一个loginT
  • 使用Cgroups限制cpu使用

    我正在尝试使用 cgroups 来限制 CPU 使用率 我正在使用本指南https access redhat com documentation en US Red Hat Enterprise Linux 6 html Resource
  • 无法从使用本地类型参数化的另一个包中实现来自另一个包的泛型类型的特征

    此测试代码 playpen use std fmt Display Formatter Error struct MyLocalType type MyResult Result
  • 在java中绘制圆的切片?

    我想通过一个实心圆来表示一个计时器 该实心圆是在计时器的过程中逐段完全绘制的 IE 如果在 4 秒计时器内每 1 秒填充一次圆圈 第一个将显示四分之一圆 然后是半圆 然后是四分之三 最后是一个完整的圆 有没有办法在java中绘制这些圆的切片