重画问题

2024-01-01

我的方法中的重绘有问题move。我不知道该怎么做,代码如下

import java.awt.*;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.sound.sampled.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.event.*;
import java.lang.*;

public class bbb extends JPanel
{
    public Stack<Integer> stacks[];
    public JButton auto, jugar, nojugar;
    public JButton ok, ok2;
    public JLabel info = new JLabel("Numero de Discos: ");
    public JLabel instruc = new JLabel("Presiona la base de las torres para mover las fichas");
    public JLabel instruc2 = new JLabel("No puedes poner una pieza grande sobre una pequenia!");
    public JComboBox numeros = new JComboBox();
    public JComboBox velocidad = new JComboBox();
    public boolean seguir = false, parar = false, primera = true;
    public int n1, n2, n3;
    public int click1 = 0;
    public int opcion = 1, tiempo = 50;
    public int op = 1, continuar = 0, cont = 0;
    public int piezas = 0;
    public int posx, posy;
    public int no;

    public bbb() throws IOException
    {
        stacks = new Stack[3];
        stacks[0] = new Stack<Integer>();
        stacks[1] = new Stack<Integer>();
        stacks[2] = new Stack<Integer>();
        setPreferredSize(new Dimension(1366, 768));
        ok = new JButton("OK");
        ok.setBounds(new Rectangle(270, 50, 70, 25));
        ok.addActionListener(new okiz());
        ok2 = new JButton("OK");
        ok2.setBounds(new Rectangle(270, 50, 70, 25));
        ok2.addActionListener(new vel());
        add(ok2);
        ok2.setVisible(false);
        auto = new JButton("Automatico");
        auto.setBounds(new Rectangle(50, 80, 100, 25));
        auto.addActionListener(new a());
        jugar = new JButton("PLAY");
        jugar.setBounds(new Rectangle(100, 100, 70, 25));
        jugar.addActionListener(new play());
        nojugar = new JButton("PAUSE");
        nojugar.setBounds(new Rectangle(100, 150, 70, 25));
        nojugar.addActionListener(new stop());
        setLayout(null);
        info.setBounds(new Rectangle(50, 50, 170, 25));
        info.setForeground(Color.white);
        instruc.setBounds(new Rectangle(970, 50, 570, 25));
        instruc.setForeground(Color.white);
        instruc2.setBounds(new Rectangle(970, 70, 570, 25));
        instruc2.setForeground(Color.white);
        add(instruc);
        add(instruc2);
        add(jugar);
        add(nojugar);
        jugar.setVisible(false);
        nojugar.setVisible(false);
        add(info);
        info.setVisible(false);
        add(ok);
        ok.setVisible(false);
        add(auto);

        numeros.setBounds(new Rectangle(210, 50, 50, 25));
        numeros.addItem(1);
        numeros.addItem(2);
        numeros.addItem(3);
        numeros.addItem(4);
        numeros.addItem(5);
        numeros.addItem(6);
        numeros.addItem(7);
        numeros.addItem(8);
        numeros.addItem(9);
        numeros.addItem(10);
        add(numeros);
        numeros.setVisible(false);

        velocidad.setBounds(new Rectangle(150, 50, 100, 25));
        velocidad.addItem("Lenta");
        velocidad.addItem("Intermedia");
        velocidad.addItem("Rapida");
        add(velocidad);
        velocidad.setVisible(false);
    }

    public void Mover(int origen, int destino)
    {
        for (int i = 0; i < 3; i++)
        {
            System.out.print("stack " + i + ": ");
            for (int n : stacks[i])
            {
                System.out.print(n + ";");
            }
            System.out.println("");
        }
        System.out.println("de <" + origen + "> a <" + destino + ">");
        stacks[destino].push(stacks[origen].pop());
        System.out.println("");
        this.validate();
        this.repaint();
    }

    public void hanoi(int origen, int destino, int cuantas)
    {
        while (parar)
        {
        }
        if (cuantas <= 1)
        {
            Mover(origen, destino);
        }
        else
        {
            hanoi(origen, 3 - (origen + destino), cuantas - 1);
            Mover(origen, destino);
            hanoi(3 - (origen + destino), destino, cuantas - 1);
        }
    }

    public void paintComponent(Graphics g)
    {
        ImageIcon fondo = new ImageIcon("fondo.jpg");
        g.drawImage(fondo.getImage(), 0, 0, 1366, 768, null);

        g.setColor(new Color((int) (Math.random() * 254),
            (int) (Math.random() * 255),
            (int) (Math.random() * 255)));
        g.fillRect(0, 0, 100, 100);

        g.setColor(Color.white);
        g.fillRect(150, 600, 250, 25);
        g.fillRect(550, 600, 250, 25);
        g.fillRect(950, 600, 250, 25);
        g.setColor(Color.red);
        g.fillRect(270, 325, 10, 275);
        g.fillRect(270 + 400, 325, 10, 275);
        g.fillRect(270 + 800, 325, 10, 275);

        int x, y, top = 0;
        g.setColor(Color.yellow);

        x = 150;
        y = 580;
        for (int ii : stacks[0])
        {
            g.fillRect(x + ((ii * 125) / 10), y - (((ii) * 250) / 10), ((10 - ii) * 250) / 10, 20);
        }

        x = 550;
        y = 580;
        for (int ii : stacks[1])
        {
            g.fillRect(x + ((ii * 125) / 10), y - (((ii) * 250) / 10), ((10 - ii) * 250) / 10, 20);
        }

        x = 950;
        y = 580;
        for (int ii : stacks[2])
        {
            g.fillRect(x + ((ii * 125) / 10), y - (((ii) * 250) / 10), ((10 - ii) * 250) / 10, 20);
        }

        System.out.println("ENTRO");

        setOpaque(false);
    }

    private class play implements ActionListener //manual 
    {
        public void actionPerformed(ActionEvent algo)
        {
            parar = false;
            if (primera = true)
            {
                hanoi(0, 2, no);
                primera = false;
            }
        }
    }

    private class stop implements ActionListener //manual 
    {
        public void actionPerformed(ActionEvent algo)
        {
            parar = true;
        }
    }

    private class vel implements ActionListener //manual 
    {
        public void actionPerformed(ActionEvent algo)
        {
            if (velocidad.getSelectedItem() == "Lenta")
            {
                tiempo = 150;
            }
            else if (velocidad.getSelectedItem() == "Intermedia")
            {
                tiempo = 75;
            }
            else
            {
                tiempo = 50;
            }
            ok2.setVisible(false);
            jugar.setVisible(true);
            nojugar.setVisible(true);
        }
    }

    private class a implements ActionListener //auto 
    {
        public void actionPerformed(ActionEvent algo)
        {
            auto.setVisible(false);
            info.setVisible(true);
            numeros.setVisible(true);
            ok.setVisible(true);
            op = 3;
        }
    }

    private class okiz implements ActionListener //ok
    {
        public void actionPerformed(ActionEvent algo)
        {
            no = Integer.parseInt(numeros.getSelectedItem().toString());
            piezas = no;
            if (no > 0 && no < 11)
            {
                info.setVisible(false);
                numeros.setVisible(false);
                ok.setVisible(false);
                for (int i = no; i > 0; i--)
                {
                    stacks[0].push(i);
                }
                opcion = 2;
                if (op == 3)
                {
                    info.setText("Velocidad: ");
                    info.setVisible(true);
                    velocidad.setVisible(true);
                    ok2.setVisible(true);
                }
            }
            else
            {
            }
            repaint();
        }
    }
}

调用该类的另一个类的代码如下:

import java.awt.*;
import java.io.*;
import java.net.URL;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.border.*;
import java.lang.*;
import java.awt.event.*;

public class aaa extends JPanel 
{        
    private ImageIcon Background;
    private JLabel fondo;

    public static void main(String[] args) throws IOException 
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        final JPanel cp = new JPanel(new BorderLayout());
        JFrame frame = new JFrame ("Torres de Hanoi");

        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize(550,550);
        frame.setVisible(true);

        bbb panel = new bbb();

        frame.getContentPane().add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}

假设您在 println 语句中看到进度,但在屏幕上看不到,这是因为对 repaint 的调用不同步。 Swing 有一个特殊的线程用于处理 UI - 称为事件调度线程。对重绘的调用由该线程处理,但异步处理 - 在该线程上安排的所有当前事件都已处理之后。

当您在 actionPerformed 中调用 hanoi 时,这是在同一个 UI 线程上完成的。发生的情况是,在递归完全完成之前, repaint() 调用只是排队。一旦递归完成(并且所有堆栈都已在模型中移动),UI 线程就会处理所有 repaint() 请求,绘制 - 我假设的 - 最终状态。

您需要做的是将模型处理分离到单独的工作线程中。在每个递归步骤中,发出 repaint() 调用并休眠几百毫秒。这将允许 UI 线程重新绘制模型的当前状态,并让用户实际跟踪进度。

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

重画问题 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 为什么将带有尾随空格的行提交到源代码管理中是不好的?

    为什么将带有尾随空格的行签入到源代码管理中是不好的 这会导致什么类型的问题 基本上是错误的差异 如果差异仅显示 真实 更改 则会很有帮助 一些 diff 程序会忽略空格 但最好首先避免虚拟更改 当然 如果它在同事的机器上换行也无济于事
  • 第三方广告提供商的广告如何传送到网页?

    当网页加载到浏览器中时 第三方广告提供商如何决定向网页投放什么广告 这些数据以什么格式传送 假设我的网页不包含与广告相关或差异化的内容 但我确实了解我的用户的很多信息 人口统计资料 兴趣 浏览历史记录等 因此 我想要加载的广告必须依赖于用户
  • 如何使 iframe 适合整个屏幕而不指定尺寸?

    如果我不指定任何尺寸 iframe 就会显得很小 如果我确实按如下方式指定尺寸 则它无法针对不同的屏幕分辨率正确缩放 有没有办法自动让 iframe 拉伸到整个屏幕 Use
  • 如何在 SBT 构建中跳过测试?

    我有一个 SBT 0 7 5 项目 它的一些测试用例失败了 在修复所有测试用例之前 我想跳过测试来生成 JAR 是否有任何命令行参数告诉 SBT 跳过所有测试 例如 Maven 的 Dmaven test skip true flag 我遇
  • 在主线程之外创建 QDialog 的方法

    我正在尝试在 QT 中创建一个客户端应用程序 它需要两个线程进行处理和可变数量的窗口实例 但我很难弄清楚如何在处理线程之一内创建一个新窗口 我知道所有 ui 元素必须在与 QApplication 类相同的线程中创建 但我需要能够实例化 或
  • 如何使用 git fetch 覆盖本地标签?

    如何使用 git fetch 覆盖本地标签 我想用远程标签替换本地标签 从 Git 2 20 开始 您需要显式指定强制标志 git fetch origin tags force 在 Git 版本 2 20 之前 与使用 git push
  • 推送“未签出”分支

    我想推送一个分支 不是当前的 而不必先检查它 我怎样才能实现这一点 这就是我要做的 currently in master git checkout feature git push origin feature git checkout
  • seaborn boxplot:更改均值的颜色和形状

    我似乎找不到答案的简单问题 如何更改 Seaborn 箱线图中平均指标的颜色和形状 它默认为绿色三角形 通常很难看到 我试图在 seaborn 文档和 matplotlib 文档中找到答案 stackoverflow 上还有一个相关问题 有
  • Foundation 5、Simple Form 和 Rails - 如何让“提示”CSS 类正常工作

    我已经搜索了几天并进行了实验 但我无法获得要显示的简单表单 gem 提示 CSS 类 这只是一个类 当您将鼠标悬停在表单输入上时显示表单输入的提示 我正在使用 Rails 4 1 以及最新的 simple form gem 和 Founda
  • Java api 到 exiftool

    我对用 java api 或类似的东西解析 exiftool 结果很感兴趣 我一直在研究 但没有找到任何例子 例如 我如何在我的java项目中获得这些结果 Exif工具版本号 8 22 文件名 Exif工具 jpg 目录 t images
  • 使用 GCC 和 Egypt 生成综合调用图

    我正在尝试生成一个全面的调用图 包括对 Linux 运行时等的低级调用 我使用 fdump rtl expand 静态编译了我的源文件并创建了 RTL 文件 我将其传递给名为 Egypt 的 PERL 脚本 我认为是 Graphviz Do
  • 在数据网格中查找文本框

    我有一个包含四列的数据网格 因此 从 C 端的这个数据网格中 我想找到 name headBox 的特定文本框 我该怎么做呢 我的该列的 xaml 如下所示 此部分位于 Datagrid Columns 中 该列位于名称 dgrid 的 d
  • 如何阻止某些记录在 SQL 查询中多次显示

    这里是完整的 SQL Fiddle http rextester com MTIFT55374 如您所见 记录来自recommendations表显示多次 但是如果我删除这一行LEFT JOIN cast ON cast cast tmdb
  • 为参数“appIdName”提供了“无效值”?

    我已经在这个应用程序上工作了几个星期 一切都很棒 我一直在建造 归档并玩得很开心 所有证书 个人资料和 ID 看起来 都井然有序且运行良好 然后几天前 似乎没有任何我能看出的变化 Xcode 说我没有任何 具有有效签名身份的配置文件 当我告
  • 在 ruby​​ 中,如何使用映射方法调用方法链?

    我将如何调用要使用的块 id to s在红宝石中 category ids categories map id to s 我正在破解它并立即执行以下操作 category ids categories each do c category
  • 基于 Maven POM 的自动化构建系统中依赖真实性验证

    我刚刚被指出一个非常有趣的article http www fortify com servlet downloads public fortify attacking the build pdf archived https web ar
  • HTML.ActionLink 方法

    假设我有课 public class ItemController Controller public ActionResult Login int id return View Hi id 在不位于 Item 文件夹的页面上 其中Item
  • 登录后出现404.0错误。 Asp.Net MVC 和 IIS 7.5

    我有一个在 IIS 7 5 上运行的 ASP NET MVC 应用程序 已启用表单验证 我可以访问登录页面 这意味着路线没问题 但是当我登录应用程序时应该将发布数据发送到http localhost tgpwebged Account Lo
  • Next.js 与 pkg。语法需要启用以下解析器插件之一:“flow, typescript”

    我使用 next js 与pkg https www npmjs com package pkg在我基于此的项目中tutorial https medium com evenchange4 deploy a commercial next
  • 重画问题

    我的方法中的重绘有问题move 我不知道该怎么做 代码如下 import java awt import java io import java text import java util import javax sound sample