我目前正在用java编写一个绘图程序,旨在具有灵活和全面的功能。它源于我前一天通宵写的最后一个项目。正因为如此,它有大量的错误,我一直在一一解决(例如,我只能保存空文件,我的矩形没有正确绘制,但我的圆圈可以......)。
这一次,我一直在尝试将撤消/重做功能添加到我的程序中。但是,我无法“撤消”我所做的事情。因此,我想在每次触发 mouseReleased 事件时保存我的 BufferedImage 副本。但是,由于某些图像的分辨率为 1920x1080,我认为这样做效率不高:存储它们可能会占用千兆字节的内存。
我不能简单地用背景颜色绘制相同的东西以撤消的原因是因为我有许多不同的画笔,它们基于 Math.random() 进行绘制,并且因为有有许多不同的层(在一个层中)。
然后,我考虑将用于绘制的 Graphics 对象克隆到 BufferedImage。像这样:
ArrayList<Graphics> revisions = new ArrayList<Graphics>();
@Override
public void mouseReleased(MouseEvent event) {
Graphics g = image.createGraphics();
revisions.add(g);
}
我以前没有这样做过,所以我有几个问题:
BufferedImages?最佳答案
不,存储 Graphics 对象通常是个坏主意。 :-)
原因如下:通常,Graphics 实例是短暂的,用于在某种表面(通常是 (J)Component 或 缓冲图像)。它保存这些绘图操作的状态,如颜色、笔触、比例、旋转等。但是,它不保存绘图操作或像素的结果。
因此,它不会帮助您实现撤消功能。像素属于组件或图像。因此,回滚到“以前的”Graphics 对象不会将像素修改回以前的状态。
以下是一些我知道可行的方法:
使用“链”命令(命令模式)来修改图像。命令模式非常适合撤销/重做(并在 Action 中的 Swing/AWT 中实现)。从原始开始依次渲染所有命令。优点:每个命令中的状态通常不是那么大,允许您在内存中有许多步骤的 undo-buffer。缺点:经过大量操作,变慢了……
对于每个操作,存储整个 BufferedImage(就像您最初所做的那样)。优点:易于实现。缺点:你会很快耗尽内存。提示:您可以序列化图像,使撤消/重做占用更少的内存,但代价是更多的处理时间。
上述的组合,使用命令模式/链的想法,但在合理的情况下使用“快照”(如 BufferedImages)优化渲染。这意味着您不需要为每个新操作从头开始渲染所有内容(更快)。还将这些快照刷新/序列化到磁盘,以避免内存不足(但如果可以的话,将它们保留在内存中,以提高速度)。您还可以将命令序列化到磁盘,以实现几乎无限的撤消。优点:如果做得好,效果很好。缺点:需要一些时间才能正确。
PS:对于以上所有,您需要使用后台线程(如 SwingWorker 或类似的)在后台更新显示的图像,将命令/图像存储到磁盘等,以保持响应式 UI。
祝你好运! :-)
关于java - 存储图形对象是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31370403/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装rubygems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf