运行线程时,旋转变换在重绘中无法正常工作

2023-12-21

我一直在努力使这个程序正常工作,尽管我似乎找不到问题所在。这个程序由以下两个类组成,不多也不少。基本上应该在绘图区域中每次单击时绘制一个点,并在第三次单击时连接所有点。我仍然需要努力让它变得更漂亮、更准确,但这部分是有效的。不起作用的是应该遵循的操作:第四次单击时,线程应该启动(并且它启动了),并且三角形本身应该在给定任意刷新率的情况下旋转,正好进行 80 次重绘。在动画完成之前,下一次单击不应该起作用,只有在动画停止(线程终止)后单击时,才会显示一个新点并重新开始。

是否有可能所有绘制调用都被堆叠起来直到我的线程结束?我知道可能会发生所有事件都堆叠在事件队列中并被视为一个事件的情况。使用带有时间参数的重绘没有帮助。我添加了注释来帮助澄清,因为所有变量都是法语单词(它们已被解释)。我很难弄清楚是否在我的代码中找到问题,是否与线程相关,甚至与类型相关。我只是在调试模式下无处可去(使用Eclipse)。我是否完全忽略了一些显而易见的事情?

虽然我的方法可能不是最有效的方法,但轮换是我的主要问题。我可以编写代码中未写的剩余部分。 谢谢你的帮助!这是两个类:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Application extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JButton btnTerminer;
private Triangle triangle;
private int totalClics = 0;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Application frame = new Application();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Application() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 453, 692);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    btnTerminer = new JButton("Terminer");
    btnTerminer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    });
    btnTerminer.setBounds(138, 622, 132, 23);
    contentPane.add(btnTerminer);

    triangle = new Triangle();
    //Adds points for every mouse click
    triangle.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if(totalClics < 3){
                triangle.ajouterPoint(e.getX(), e.getY());
                totalClics++;
            } else {
                triangle.getAnim().start();
                totalClics = 0;
            }
        }
    });
    triangle.setBounds(10, 11, 400, 600);
    contentPane.add(triangle);
}
}

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;


import javax.swing.JPanel;


public class Triangle extends JPanel implements Runnable,Serializable{

private static final long serialVersionUID = 1L;
private ArrayList<Point> points = null;
//Animation thread
private Thread anim;
private Color couleurPrin;
private Color couleurBoite;
//A point's diameter
private int diametre = 8;
//The rectangle's width
private int largeur;
//The rectangle's height
private int hauteur;
//The rectangle's top-left corner
private int minX;
private int minY;
//Angle incrementation multiplier
private int nbAng = 0 ;
//Thread stopping variable
private boolean continuer = true;


public Triangle() {
    setPreferredSize(new Dimension(400, 600));
    setBackground(Color.BLACK);
    couleurPrin = Color.GREEN;
    couleurBoite = Color.RED;
    setAnim(new Thread(this));
    points = new ArrayList<Point>();


}
/**
 * Repaints this component
 */
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    int i = 0;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    int[] coorX = new int[points.size()+1];
    int[] coorY = new int[points.size()+1];
    Iterator<Point> iter = points.iterator();
    while(iter.hasNext()){
        Point p = iter.next();
        coorX[i] = p.getX();
        coorY[i]= p.getY();
        i++;
    }
    coorX[points.size()] = coorX[0];
    coorY[points.size()] = coorY[0];
    if(points.size() != 0){
        g2d.setColor(Color.white);
        g2d.fillOval(minX+largeur/2, minY+hauteur/2, 6, 6);
        g2d.setColor(couleurPrin);
        for(i =0; i<points.size(); i++){
            g2d.drawLine(coorX[i], coorY[i], coorX[i+1], coorY[i+1]);
        }
        for(i = 0; i<points.size(); i++){
            g2d.fillOval(coorX[i]-diametre/2, coorY[i]-diametre/2, diametre, diametre);
        }
        g2d.setColor(couleurBoite);
        g2d.drawRect(minX, minY, largeur, hauteur);
        g2d.rotate(15.0*nbAng, (largeur+getWidth())/2, (hauteur+getWidth())/2); 


    }

}
/**
 * Adds a point. Stops at 3.
 * @param x
 * @param y
 * 
 * 
 */
public void ajouterPoint(int x, int y){
    Point p = new Point(x,y);
    System.out.println(p.toString());
    if(points.size()>=0 && points.size()<3){
        points.add(p);
        minX = p.getX()-3;
        minY = p.getY()-3;
    }
    if(points.size() == 3){
        rectanguler(points);
    }
    repaint();

}

public Color getCouleurPrin() {
    return couleurPrin;
}
public void setCouleurPrin(Color c) {
    this.couleurPrin = c;
    repaint();
}
public int getDiametre() {
    return diametre;
}
public void setDiametre(int d) {
    this.diametre = d;
    repaint();
}
/**
 * Sets rectangle's values to the largest bounds possible
 * @param points
 */
private void rectanguler(ArrayList<Point> points){
    Iterator<Point> iter = points.iterator();
    Point p1, p2, p3;
    p1 = iter.next();
    p2 = iter.next();
    p3 = iter.next();
    int dLarg;
    int dLong;
    if(p2 != null && p3 != null){
        minX = Math.min(p1.getX(), p2.getX());
        minY = Math.min(p1.getY(), p2.getY());
        largeur = Math.abs(p1.getX()-p2.getX());
        hauteur = Math.abs(p1.getY()-p2.getY());
        if(p3 != null){
            minX = Math.min(minX, p3.getX());
            minY = Math.min(minY, p3.getY());
            dLarg = Math.max(Math.abs(p3.getX()-p2.getX()), Math.abs(p3.getX()-p1.getX()));
            dLong = Math.max(Math.abs(p3.getY()-p2.getY()), Math.abs(p3.getY()-p1.getY()));
            largeur = Math.max(dLarg, largeur);
            hauteur = Math.max(dLong, hauteur);
        }       
    }
}
/**
 * Custom point class
 * Stores an x and y value
 *
 */
private class Point{
    @Override
    public String toString() {
        return "Point [x=" + x + ", y=" + y + "]";
    }
    private int x,y;
    public Point(){
        setX(0);
        setY(0);
    }
    public Point(int x,int y){
        setX(x);
        setY(y);
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

}
/**
 * Starts the rotation
 * 
 */
@Override
public void run() {
    int i =1;
    while(continuer){

        nbAng = i;
        repaint();
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            System.out.println("Erreur dans le thread");
            e.printStackTrace();
        }
        i++;
        if(i== 80){
            continuer = false;
        }
    }
    anim = new Thread(this);

}
public Thread getAnim() {
    return anim;
}
public void setAnim(Thread anim) {
    this.anim = anim;
    repaint();
}

}

第一个问题是你从不打电话start()在动画线程上。

第二个问题是你应该never在 EDT 之外做 gui 的事情。正如 @AndrewThompson 在他的评论中提到的,你应该使用秋千Timer http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html而不是线程。

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

运行线程时,旋转变换在重绘中无法正常工作 的相关文章

  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • Ruby MRI 1.8.7 - 文件写入线程安全

    在我看来 在 Ruby MRI 1 8 7 中写入文件是完全线程安全的 示例 1 完美的结果 File open test txt a f threads 1 000 000 times do n threads lt lt Thread
  • 易失性数组 C++

    我有一个应用程序 它有一个指针数组MyObject对象 MyObject arr arr new MyObject 10 应用程序有两个线程 这些线程会创建和删除new MyObject 排列arr 所以arr n 会一直改变 但是MyOb
  • 带嵌入式 tomcat 的 spring-boot 不会将请求分派到控制器

    我有一个使用 spring boot 和嵌入式 Tomcat 容器的应用程序 据我所知 我的代码与 spring boot 相同示例项目 https github com spring projects spring boot tree m
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • 如何在不冒 StackOverflowError 风险的情况下使用 CompletableFuture?

    我想遍历异步函数的搜索空间 我将逻辑编码如下 Assuming that a function maps a range of inputs to the same output value minimizes the input valu
  • 是否有适用于 Java 的 CalDAV 客户端库? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 CalDAV 协议与我的日
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 在 Hibernate 的 XML 配置文件中指定默认值

    我通过映射配置文件配置 Hibernate
  • Java中如何将Object[]转换为String[]?

    我有一个关于 Java 的问题 我有一个Object Java默认的 不是用户定义的 我想将它转换为String 谁能帮我 谢谢 这是转换 for int i 0 i lt objectArr length i try strArr i o
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • Java 中有类似 .NET 的 NotImplementedException 的东西吗?

    有没有类似 NET 的东西NotImplementedException在Java中 康芒斯朗 http commons apache org proper commons lang javadocs api 2 6 org apache
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • TransformClassesWithDesugarForDebug 出错

    我在编译 APK 调试或发布 时遇到问题 Android Studio 3 0 Beta 5 这是我的构建 gradle app buildscript repositories maven url https maven fabric i
  • Sql Server 中的按位与

    我有一个非常典型的情况 我们有一个名为 Users 的表 其中有一列名为 Branches varchar 1000 该组织可以有 1000 个分支机构 因此 如果用户有权访问分支 1 5 和 10 则分支字符串将如下所示 10001000
  • 为 JavaScript 代码创建循环[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想为以下 js 代码创建一个循环
  • 主键身份值因唯一键约束违规而增加

    我有一个 Sql Server 2008 表 其中有一个主键 Identity Yes 和构成唯一键约束的其他三个字段 此外 我有一个存储过程 用于将记录插入表中 并使用 SqlConnection 对象通过 C 调用存储过程 C 存储过程
  • 如何更新 Angular Array 中的现有项目(已从外部更改)?

    我是 Angular 新手 正在努力更新 Angular 数组中已从外部更改 不是通过 Angular 支持的 UI 的现有项目 这是用例 我的网页是通过服务器端调用填充的 我将数组加载到 Angular 中并显示在列表上 现在 如果服务器
  • 采访中的任务。我们该如何解决呢?

    以这种方式转换字符串 let initialString atttbcdddd result must be like this at3bcd4 但重复次数必须大于2 例如 如果我们有 aa 结果将是 aa 但如果我们有 aaa 结果将是
  • 使用模式中的数组复制到 postgres 中?

    我正在使用 Ruby Rails Postgres 我的表看起来像这样 架构方面 CREATE TABLE my table name my num double precision NOT NULL my string arr chara
  • BST 中的第二个最大值

    这是一道面试题 找到 BST 中的第二个最大值 最大元素是 BST 中最右边的叶子 第二个最大值是其父级或其左子级 所以解决方案是遍历 BST 找到最右边的叶子并检查其父节点和左子节点 是否有意义 不 那是错误的 考虑这个 BST 137
  •  内容不收缩的 Flex 项目[重复]                
                

    这个问题在这里已经有答案了 我有一个需要握住的布局
  • 手动安装 Ruby 1.8.7(和其他东西)

    我不想再依赖一键安装程序 我想学习如何手动安装 Ruby 有这方面的资源吗 在此处下载 Ruby 1 8 7 的 Windows 二进制文件 http www ruby lang org en downloads http www ruby
  • 关于多核CPU的x86 LOCK问题

    当执行 LOCK 后面的指令时 x86 ASM LOCK 命令前缀是否会导致所有内核冻结 我在一篇博客文章中读到了这一点 但它没有意义 我找不到任何东西表明这是否属实 这是关于锁定该地址的内存总线 Intel 64 和 IA 32 架构软件
  • Gmail API:如何获取访问令牌?

    我正在测试邮箱API https developers google com gmail api 到目前为止我已经做了以下事情 我已经在中创建了该项目谷歌开发者控制台 https console developers google com
  • capybara:用终止输入键填写表单字段值

    我正在测试条形码阅读器输入 它的行为类似于键盘 但用回车键字符终止每个条形码 我的 javascript 检测到输入键并响应 backbone js 应用程序 如何使用具有终止输入键值的字符串 填写 表单字段 我的测试堆栈是cucumber
  • Windows 窗体上的甘特图控件 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AsyncPostBackTrigger 在我的应用程序中不起作用

    我遇到一个有趣的问题 我们正在使用母版页运行一个网站 在其中一个页面中 我需要创建一个更新面板 该面板将在完成时显示组 SSID 因此 在内容占位符之一中 我将其放入
  • Unicode“退格键”U+0008 的用途是什么?

    Unicode 字符 BACKSPACE U 0008 在编程中的用途是什么 它可以用于哪些应用 On output to a terminal it typically moves the cursor one position to t
  • Pandas:将具有重复行名称的数据重塑为列

    我有一个类似这样的数据集 显示第一行 Sample Detector Cq P 1 106 23 53152 P 1 106 23 152458 P 1 106 23 685083 P 1 135 24 465698 P 1 135 23
  • 如何规避第 3 方 https 网站的同源政策?

    我有一个http 需要访问第三方 JSON API 的站点 该 API 公开在https 地点 我已读完规避同源策略的方法 https stackoverflow com questions 3076414 ways to circumve
  • 从包内读取 SSIS 包文件名(包部署)

    我使用包部署模型在 Visual Studio SSDT 2012 中创建了一个 SSIS 包 有没有办法从包内以只读变量或属性的形式访问包的文件名 我没有看到它被列为系统变量 有什么办法可以通过脚本任务吗 我认为您需要检查 System
  • 运行线程时,旋转变换在重绘中无法正常工作

    我一直在努力使这个程序正常工作 尽管我似乎找不到问题所在 这个程序由以下两个类组成 不多也不少 基本上应该在绘图区域中每次单击时绘制一个点 并在第三次单击时连接所有点 我仍然需要努力让它变得更漂亮 更准确 但这部分是有效的 不起作用的是应该