Tag: java 2d

RoundRectangle2D剪辑不是很流畅

我有一个JPanel,我想剪角,使它有圆角。 这就是我在做的事情。 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(color); Shape s = new RoundRectangle2D.Double(0, 0, width, height, arc, arc); g.setClip(s); 请注意,我正在将clipping设置为RoundRectangle2D。 此外,我设置anti-aliasing仍然我的圆形边缘真的是锯齿状。 软剪辑示例此链接有一种方法可以为图像执行柔和的圆角边缘。 我如何将其应用于JPanel?

如何使用另一个象限作为坐标在JPanel上绘图?

我想通过覆盖paintComponent在JPanel上绘制一些形状。 我希望能够平移和缩放。 使用AffineTransform和Graphics2D对象上的setTransform方法可以轻松进行平移和缩放。 在做完之后,我可以使用g2.draw(myShape) myShape)绘制形状。形状用“世界坐标”定义,因此在平移时它可以正常工作,我必须在绘制之前将它们转换为canvas/ JPanel坐标。 现在我想改变坐标的象限 。 从JPanel和计算机经常使用的第四象限到用户最熟悉的第一象限。 X是相同的,但是Y轴应该向上而不是向下增加。 通过new Point(origo.x, -origo.y);很容易重新定义origo new Point(origo.x, -origo.y); 但是如何在这个象限中绘制形状? 我想保持形状的坐标(在世界坐标中定义)而不是在canvas坐标中。 所以我需要以某种方式转换它们,或者转换Graphics2D对象,我想有效地做到这一点。 我也可以使用AffineTransform吗? 我的绘图代码: public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setColor(Color.blue); AffineTransform at = g2.getTransform(); at.translate(-origo.x, -origo.y); at.translate(0, getHeight()); at.scale(1, -1); g2.setTransform(at); g2.drawLine(30, 30, 140, 20); g2.draw(new CubicCurve2D.Double(30, 65, 23, 45, 23, 34, 67, […]

多次调用paintComponent()

我有这两个类: public class Pencil extends JComponent implements MouseListener, MouseMotionListener{ Plansa plansa; Graphics g; public Pencil(Plansa newCanvas){ this.plansa = newCanvas; this.plansa.setFlagShape(false); } @Override public void mouseDragged(MouseEvent arg0) { plansa.setMouseDragged(arg0); this.plansa.setFlagShape(false); plansa.paintComponent(plansa.getGraphics()); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent arg0) { plansa.setMousePressed(arg0); } @Override public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated […]

Java Swing:将鼠标hover在矩形上时,光标响应非常慢

下面是用户将鼠标光标移动到一堆矩形上的代码,光标应该在矩形上方变为手形光标,并在不在给定矩形顶部时恢复为默认正常光标。 问题:解决方案有效,但速度很慢。他们有很多方法可以“给猫皮肤”,因此我们可以在很多方面对问题进行建模,解决方案可以是各种各样的,但不变的是,我们必须循环每个矩形使用迭代器并使用contains()方法确定JPanel上的给定点是否确实在矩形内,并相应地更改光标。 就像需要实现声音一样简单,即在hover在特定矩形上时更改光标,程序开始变慢,因为我添加了不同的形状和更多的矩形。 下面的代码简单地显示了与x轴对齐的矩形和与y轴对齐的矩形。我将它们 (仍然可以将它们组合成一个列表)分成两个矩形列表。我用一个while循环迭代两个列表另一个,每个都在适当的地方使用break关键字。 我避免只使用一个大型列表来保存两种类型的矩形(或不同类型的形状),因为 我需要每隔一段时间添加不同的形状,并且它更好,更易读,可以在自己的列表中分类不同的形状。 我本能地试图通过对不同的形状使用不同的列表来缩短漫长的过程, 如果可能的话 ,只迭代正确的列表而不是迭代其他不必要的形状。一个大的列表将线性增长并迭代***所有塑造***以一直***到正确的***。***一个大的列表似乎不是一个如此聪明的实现? 希望尽我所能避免One-Large-List的努力不是过早优化的情况!!!这一点我认为使用线程同时或同时循环遍历不同的列表但是一个线程行为不端。 那么,我将形状分类在不同的List中,因为下面的示例有两个Lists.but这个技巧也失败了,因为我必须按顺序遍历每个列表。所以我在另一个列表中有一个while循环。我没有避免迭代不必要的列表,因为一个循环必须在另一个循环中(或者从另一个循环开始),那么内循环(或后面的循环)会支付过度的性能开销,因为如果我们可以事先确定一个形状属于一个形状,那么第一个循环是完全没有必要的。手上的某个组。请注意,确定鼠标光标是否hover在属于圆形列表或矩形列表的形状上,是我们事先需要知道的! 这样我们就可以遍历特定的列表。 它甚至变得更好,如果在这一点上你仍然可以按照我的推理, 事先知道哪个List属于一个必须在没有contains()方法的情况下完成,因为在List 内部迭代时要使用contains()! ! 总而言之,下面的代码只是两个列表上的线性迭代。 要访问第二个List,你必须通过第一个。有没有办法可以先通过迭代第一个列表? 如果我所有的解释和探索都是错误的并且没有意义。 题。 那么,如何改进下面代码的光标响应。 编辑 很抱歉发布了无法编译的代码,我已经从这个代码片段开始,并且正在玩我的新玩具,称为线程,直到我最终将自己绑在一个我无法解开的结中。真相是我选择的线程,因为我希望选择矩形并使用setRect()方法移动它们。我设想在预定的运动中移动各种形状,即仿射转换可能需要线程,因为我的绘画,重新绘制,搜索和各种努力工作从一些multithreading中受益。总之,下面的代码编译,光标响应实际上是好的! 。哎哟! 我有一个类似的实现,但可能它的缓慢是由绘制矩形的其他类引起的,不像在这个SSCCE中,它们由for循环绘制。 同时,如果有人有办法通过线程获得这种良好的性能,那将非常感激。谢谢提前。 import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.*; […]

碰撞检测教程

我应该使用AWT开发Java游戏。 我坚持“碰撞检测”的概念。 如果您可以帮助我解释概念(如何工作)或举例(源代码)的任何教程,我将不胜感激。

在java8中重绘()和双缓冲,bug?

我一直在使用Java 8上的Swing中的动画,并且遇到了一些奇怪的行为:在某些其他不相关的组件上调用repaint()后,组件的内容有时会突然变得陈旧。 下面是代码,它为我重现了这种行为: import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; public class Crosshair extends JPanel { private int currentMouseX = 0; private int currentMouseY = 0; public Crosshair() { addMouseMotionListener(new MouseAdapter() { @Override public void mouseMoved(MouseEvent e) { currentMouseX = e.getX(); currentMouseY = e.getY(); repaint(); } }); } @Override protected void paintComponent(Graphics g) { […]

如何在Java中以高性能显示许多SVG

我想要的是 我的目标是能够在Java中的单个绘图区域上显示大量SVG图像,每个图像都有自己的平移/旋转/缩放值。 我正在寻找最简单的解决方案,可选择甚至使用OpenGL来加快速度。 我试过的 我最初的天真的方法是使用SVGSalamander直接在JPanel上绘制,但性能是可悲的。 我四处寻找,并了解到我应该做一些事情,比如手动将每个SVG转换为用createCompatibleImage创建的BufferedImage,然后进行我想要的转换,然后使用双缓冲绘制它。 我在这里遇到了一些麻烦,在我继续之前,我试图寻找框架来简化事情。 我看到了什么 我对可用的选项感到有些不知所措,这就是为什么我转向SO寻求帮助的原因。 我看过: 开罗 (可能是格利茨 ?) Libart – 不确定这是否真的支持SVG 通风柜 光滑 – 看起来很有希望,但有点矫枉过正 但是无法决定什么对我来说最适合开始工作,我希望有人在这里做任何类似事情的经验。

基于Java Swing的游戏框架。 任何建议?

我正在使用Java Swing框架开发游戏。 有没有人知道基于Swing的好框架? 我主要关心重绘的性能。

使用Java将多边形拉伸到其他多边形

我的问题是我有一个带有小透视的矩形,我想将它拉回来再次呈现为矩形。 为了直观地表现它,我目前在我的图像中有类似红色的形状,我有4个Points (这个形状的每个角落)。 结果我想有一些类似蓝色的形状,我已经有了它的Rectangle对象。 我想知道是否有一种方法来复制多边形并将其绘制为另一个多边形拉伸。 我找到了适合Android的东西(setPolyToPoly),但我找不到像这样的东西。 是否有一些参考或代码示例执行此操作,或者可能有些想法如何解决此问题?

Java GUI旋转和Rectangle的翻译

我试图在JPanel中绘制一个矩形,它可以平移,然后自行旋转以模仿汽车的运动。 我已经能够使矩形平移和旋转,但它围绕(0,0)的原点旋转。 我非常高兴我可以让矩形移动和旋转,因为我对Java GUI很新,但我似乎无法得到如何让矩形围绕它自己旋转,因为我尝试了更多它,当我初始化矩形并将其旋转45度,它的位置已更改,我假设是从旋转方法附加的变换矩阵。 我通过网站查看了如何解决这个问题,但是我只发现了如何旋转矩形而不是如何旋转和移动模拟汽车的运动。 我认为它关注它的变换矩阵,但我只是猜测。 所以我的问题是如何让矩形能够旋转并在自身周围移动而不是JPanel中的一个点。 这是我到目前为止的代码: public class Draw extends JPanel implements ActionListener { private int x = 100; private int y = 100; private double theta = Math.PI; Rectangle rec = new Rectangle(x,y,25,25); Timer timer = new Timer(25,this); Draw(){ setBackground(Color.black); timer.start(); } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.white); […]