使用 TimerTask 移动 JPanel

2023-12-28

因此,我设置了一个如下图所示的 Java GUI(对于画得很糟糕的游戏表示歉意):

Java GUI 的布局

所有 JPanel 的大小都相同(图中未很好地显示)。我想做的是,当我用进度条做某事时(即读取一些文本文件),JPanels 将循环通过。红色的会到底部,橙色的会到顶部,如此循环下去。我希望它们每半秒改变一次,并在程序打开后等待 2 秒才能开始移动。我还希望他们在其中一个进度条达到 100% 时停止。

经过一些阅读后,我认为 Java TimerTask 类非常适合此操作,但我没有使用它的经验,并且不太确定如何用它来做这样的事情。

任何有关如何进行此操作的提示或想法将不胜感激!


保留颜色模型(和文本,如果“Red JPanel”是用户所看到的内容的一部分)并简单地更改现有面板的 BG 颜色以适合用作数组索引的计数器会更简单。那些颜色(/文本)组合。

正如 @MadProgrammer 所提到的,A SwingTimer会更合适,因为 Swing 计时器可确保在 EDT 上进行更新。或者更确切地说是两个计时器。第一个是单次计时器,延迟两秒。第二个将循环颜色。

像这样(根据需要调整颜色和数字):

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

public class ColorCycler {

    private JComponent ui = null;
    Color[] colors = {
        Color.RED,
        Color.ORANGE,
        Color.YELLOW,
        Color.GREEN,
        Color.CYAN.darker(),
        Color.MAGENTA.darker(),
        Color.MAGENTA.darker().darker()
    };
    int counter = 0;
    JPanel[] panels = new JPanel[colors.length];

    ColorCycler() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));
        ui.setBackground(Color.CYAN);

        ui.add(new JLabel(
                "Clock", SwingConstants.CENTER), BorderLayout.PAGE_START);
        ui.add(new JLabel(
                "Progress Bars", SwingConstants.CENTER), BorderLayout.PAGE_END);

        JPanel colorPanel = new JPanel(new GridLayout(0, 1));
        Border border = new EmptyBorder(new Insets(10, 200, 10, 200));
        for (int ii=0; ii<colors.length; ii++) {
            JPanel p = new JPanel();
            p.setBorder(border);
            panels[ii] = p;
            colorPanel.add(p);
        }
        ui.add(colorPanel, BorderLayout.CENTER);

        ActionListener colorListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                counter++;
                setColors();
            }
        };
        final Timer colorCycleTimer = new Timer(50, colorListener);

        ActionListener delayListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                colorCycleTimer.start();
            }
        };
        Timer delayTimer = new Timer(2000, delayListener);
        delayTimer.setRepeats(false);
        delayTimer.start();

        setColors();
    }

    private void setColors() {
        for (int ii=0; ii<colors.length; ii++) {
            panels[(counter+ii)%colors.length].setBackground(colors[ii]);
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ColorCycler o = new ColorCycler();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

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

使用 TimerTask 移动 JPanel 的相关文章

随机推荐

  • 如何开发 visio 加载项

    我想创建一个 visio 插件 以便可以绘制 BPMN 图 业务流程建模符号 类似的工作可以在这里找到 http www interface com free visio bpmn modeler http www interfacing
  • jdbcTemplate query() 保证维持结果集顺序吗?

    我的问题与这里提出的问题类似 http forum springsource org showthread php 84508 jdbctemplate query sorted result set http forum springso
  • Android:菜单中的圆角

    在我的 MainActivity 中onCreateOptionsMenu方法 我用四个项目扩充了一个基本菜单 请参阅菜单 main xml 由于 DialogFragment 中可能有圆角 因此如何获得此菜单的圆角 正如您在屏幕截图中看到
  • 如何检索传递给函数调用的关键字参数的原始顺序?

    检索通过 kwargs 传递的关键字参数的顺序对于我正在从事的特定项目非常有用 它是关于制作一种具有有意义维度的 n 维 numpy 数组 现在称为 dimarray 对于地球物理数据处理特别有用 现在说我们有 import numpy a
  • 如何在sql层次结构上显示祖父母?

    这是我的桌子 id parent id name 1 0 Kevin Gravey 2 0 John Chen 3 1 Clark Garvey 4 2 Halsey Chen 5 3 Carl Garvey 6 4 Betty Chen
  • Python pandas.core.indexing.IndexingError:提供了不可对齐的布尔系列键

    因此 我读取了包含 29 列的数据表 并添加了一个索引列 总共 30 列 Data pd read excel os path join BaseDir test xlsx Data reset index inplace True 然后
  • 使用 Eve 的 DB 层而不使用 HTTP

    在我的应用程序中 MongoDB 集合需要通过服务器端脚本作业 即 每 30 分钟从其他 API 抓取 拉取的 cron 作业 进行更新 我真正想做的是更新 MongoDB 集合 但根据架构验证数据并包含元数据 更新 创建等 解决这个问题想
  • 如何在 Google App Engine (GAE) 上运行的 Web2py 上创建新的 auth_user 和 auth_group?

    我在本地计算机上使用 Web2py 创建了一个应用程序 它通过 WSGI 和 SQLite 运行 我可以使用我自己的域并执行我需要的所有网址重写 成功地将我的应用程序部署到 Google App Engine 现在我需要一种方法来创建负责更
  • 为什么 Powershell Test-Path -Isvalid 总是返回 true

    根据文档 IsValid 应该检查路径的语法是否正确 我为测试路径放置的任何内容它总是返回 true 指示此 cmdlet 测试路径的语法 无论 路径的元素是否存在 如果满足以下条件 此 cmdlet 将返回 True 路径语法有效 否则
  • 删除图像之间不需要的空间

    我的问题出在我的导航栏中 可以在这里找到 http grupocoral netai net http grupocoral netai net 这些图像之间有一个空格 我想将其删除 我该怎么做 JavaScript 代码 function
  • Gradle 未知命令行选项“-X”

    我收到这个错误对话框 但不知道它来自哪里 Dialog 命令行选项为空 预先感谢您的任何答复 None
  • 通用浮点数学查询

    好吧 我知道有些数字无法用二进制正确表示 就像 1 3 无法完全用十进制表示一样 那么为什么当我 console log 0 3 它返回 0 3 但是当我 console log 0 1 0 2 它返回 0 3000000000000000
  • ASP.NET Web API:如果从资源设置错误消息,则模型有效

    问题是在 ApiController 中模型状态 IsValid总是true如果我使用 rsx 文件 资源 来提供自定义错误消息 这是我的模型 public class LoginModel public string Email get
  • 通过脚本更改后期处理光晕效果

    我正在尝试通过脚本更改绽放颜色 后处理 在检查器中颜色会发生变化 但在游戏视图中不会发生变化 请提供一些帮助 using System Collections using System Collections Generic using U
  • ZPL 批次上的 GS1 代码条

    我遇到以下问题 在我工作的地方 我正在尝试优化 ID 标签的打印 然而 有些产品在其批次中含有数字和字母 当产品只有数字时 GS1 条形码标签效果很好 但当它同时含有字母和 或符号时 它会删除一些条形码 这是一个例子 货号 410234 批
  • 删除R中列中字符后面的所有内容

    我需要删除列中问号后面的所有内容 我有一个数据集EX my data BABY MOM LANDING mark dina www example com kdvhzkajvkadjf tom becky www example com g
  • 如何解析容器中的 docker 主机名 (/etc/hosts)

    如何解析容器中 Docker 主机的 etc hosts 中定义的名称 在我的 Docker 主机中运行的容器可以解析公共名称 例如 www ibm com 因此 Docker dns 工作正常 我想从容器中解析 Docker 主机的名称
  • Cucumber 在运行单个功能时找不到步骤

    我刚刚将 Cucumber 安装到一个新的 Rails 项目中 第一次从头开始设置 并且在运行所有测试时效果非常好 bundle exec cucumber 但当我运行单个功能文件时找不到我的任何步骤 我该如何开始调试这个 rails 3
  • 防止弹性项目收缩[重复]

    这个问题在这里已经有答案了 Sample wrap outline 1px solid fuchsia display flex left background tan width 100 right background teal wid
  • 使用 TimerTask 移动 JPanel

    因此 我设置了一个如下图所示的 Java GUI 对于画得很糟糕的游戏表示歉意 Java GUI 的布局 所有 JPanel 的大小都相同 图中未很好地显示 我想做的是 当我用进度条做某事时 即读取一些文本文件 JPanels 将循环通过