Tag: awt

创建变换以从一个矩形映射到另一个矩形?

创建AffineTransform的最简单方法是将坐标从一个矩形映射到另一个矩形(给出浮点/双矩形)? 更新1 矩形可以完全不同。 例如[(0,0) – (1,1)]和[(150,-14) – ( – 1000,-14.1)]。 转型应该统一转变。 例如,矩形角应该一对一变换。 例如,坐标(0,0)应转向(150,-14)。 更新2 我需要AffineTransform对象,而不仅仅是计算。 因为我想将它应用于Graphics对象。 我也希望以简单变换的一些连接forms出现。 更新3 以下3项测试都失败了: public class RectangleTransformTest { private static final double delta = 0.001; Rectangle2D r1 = new Rectangle2D.Double(-1, 0, 2, 0.01); Rectangle2D r2 = new Rectangle2D.Double(10, 20, 400, 300); AffineTransform t; Point2D src; Point2D dst1, dst2; @Test public […]

尽可能快地清除透明的BufferedImage

我有一个透明的BufferedImage使用以下代码创建(不相关如何创建,我认为): GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); Rectangle screen = transformationContext.getScreen(); // Create an image that supports transparent pixels return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(), Transparency.BITMASK); 如何在不重新创建图像的情况下以最快的方式清除图像(处于与创建状态相同的空图像)? 重新创建映像会给GC带来负担,暂停VM并冻结UI。

Mac OS X上的剪贴板监控| Java的

我在Mac OS X上从系统剪贴板获取数据时遇到了麻烦。我要做的是每次在其中放入新的[基于文本的]信息时,都要收听系统剪贴板并打印剪贴板的内容。 问题:下面的代码在Windows 7和openSUSE Linux机器上运行得非常好,但是当我尝试在Mac OS X上运行相同的代码时,程序无法打印剪贴板的新内容,直到关注应用程序。 [在我点击底座上的应用程序图标之前,没有任何内容打印…] 我的源代码: import java.awt.Toolkit; import java.awt.datatransfer.*; import java.io.IOException; public class ClipboardListener extends Thread implements ClipboardOwner { Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); public void run(){ Transferable selection = systemClipboard.getContents(this); gainOwnership(selection); } public void gainOwnership(Transferable t){ try {this.sleep(100);} catch (InterruptedException e) {e.printStackTrace();} systemClipboard.setContents(t, this); } public void lostOwnership(Clipboard clipboard, Transferable […]

从不可见的AWT组件创建图像?

我正在尝试创建一个不可见的AWT组件的图像(屏幕截图)。 我无法使用Robot类的屏幕捕获function,因为该组件在屏幕上不可见。 尝试使用以下代码: BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); component.paintAll(g); 有时可以工作,但如果组件包含诸如文本框或按钮之类的东西,或者某种OpenGL / 3D组件(这些东西都不在图像中!),则无效。 如何对整个事物进行适当的截图?

Java – 没有图形的FontMetrics

如何在不使用Graphics的情况下获取FontMetrics? 我想在构造函数中获取FontMetrics,现在我这样做: BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); FontMetrics fm = bi.getGraphics().getFontMetrics(font); int width = fm.stringWidth(pattern); int height = fm.getHeight();

在Java 2D中实现Polygon2D

我正在使用Java2D库在Java中创建一个2D游戏,我真的需要一个浮点精度的Polygon对象,我可以用它来绘制游戏对象并对它们进行碰撞检测。 不幸的是,Java的Polygon对象只有int精度,并且没有像Rectangle和Rectangle2D那样的Polygon2D。 我已经做了足够的研究,看到我有一些选择,但它们似乎都不是很好。 使用Path2D 。 据该论坛的一位Java开发人员称,缺少Polygon2D是一种疏忽,但其建议的替代品是Path2D。 不幸的是,Path2D没有提供访问其各个顶点或边的方法,这是我进行碰撞检测所需要的(具体来说,我需要获得与每条边正交的矢量)。 实现我自己的Polygon2D实现Shape接口,这样我仍然可以将它传递给Graphics2D.draw(Shape) 。 这看起来很难。 Shape接口需要棘手的实现方法,如contains(Rectangle2D)和getPathIterator(AffineTransform) 。 特别是对于getPathIterator ,似乎为了实现它,我需要返回一个PathIterator类型的对象,但是公共AWT包中没有可用的PathIterator接口的具体实现。 在一个“记住”各个顶点并将它们提供给客户端的对象中包裹Path2D 。 当我需要一个记住其组件形状的区域时,这对我有用:我将它包装在一个实现Shape接口的CompoundShape类中,并将所有Shape方法转发给Area的实现,同时跟踪添加到其中的每个Shape。 ArrayList中的区域。 这个问题是,如果我跟踪float s的两个数组中的各个顶点,就没有办法将它们暴露给用户而没有用户更改顶点的可能性 – 并且因为直接数组访问会发生这种情况,内部Path2D不会收到有关更改的通知。 复制Polygon.java 。 Java的Polygon类的实际源代码可以在grepcode.com上找到,我可以简单地用float s替换与顶点相关的int ,以获得Polygon2D。 不幸的是,当我尝试这个时,行import sun.awt.geom.Crossings; 抛出编译器错误,说“由于对所需库C:\ Program Files \ Java \ jre7 \ lib \ rt.jar的限制,无法访问类型交叉”。 根据这个问题 ,因为Sun的许可协议会阻止您用自己的Java类替换核心Java类,但Polygon不会尝试这样做 – 它只是创建了一个类型为sun.awt.geom.Crossings的对象,没有替换或扩展发生了,我确保将我的Polygon副本放在一个名为“java”的包中。 进行此操作的最佳方法是什么? 我很欣赏这些选项中的一个如何工作的建议,或者对于没有遇到这些问题的另一个选项的想法。

AWT窗口关闭监听器/事件

如果这是一个n00b问题,我很抱歉,但是一旦我创建了Window监听器,窗口事件和其他所有内容,我就花了太长时间,如何指定要调用的方法? 这是我的代码: private static void mw() { Frame frm = new Frame(“Hello Java”); WindowEvent we = new WindowEvent(frm, WindowEvent.WINDOW_CLOSED); WindowListener wl = null; wl.windowClosed(we); frm.addWindowListener(wl); TextField tf = new TextField(80); frm.add(tf); frm.pack(); frm.setVisible(true); } 我正在尝试获取一个URL,并下载它,我已经完成了其他所有工作,我只是想让窗口关闭。

在Java中用箭头画一条线

任何人都可以指导我如何编码不同方向的箭头线。 wa和wl为正,矩形将位于x轴的顶部。 下面的示例显示wl是否定且wa是正数。 下面的代码显示了我如何编码矩形形状。 x1是可变的,表示从x轴开始的位置。 e1是形状的长度,wa1和wl1是高度。 wsign确定高度wa1或wl1应显示在负侧或正侧。 if (Math.abs(wl1) > Math.abs(wa1)) { y_scale = (load_y0 – 40) / (double) Math.abs(wl1); } else { y_scale = (load_y0 – 40) / (double) Math.abs(wa1); } g.drawLine((int) ((double) x0 + x1 * x_scale), (int) (load_y), (int) ((double) x0 + x1 * x_scale), (int) (load_y + (wa1 * y_scale) * […]

使BufferedImage使用更少的RAM?

我有java程序从硬盘驱动器读取jpeg文件,并将其用作各种其他东西的背景图像。 图像本身存储在BufferImage对象中,如下所示: BufferedImage background background = ImageIO.read(file) 这很有用 – 问题在于BufferedImage对象本身BufferedImage庞大。 例如,一个215k的jpeg文件成为一个4兆的BufferedImag e对象并进行更改。 有问题的应用程序可以加载一些相当大的背景图像,但是jpegs永远不会超过一个或两个,用于存储BufferedImage的内存可以快速超过100兆字节。 我假设这一切都是因为图像作为原始RGB数据存储在ram中,而不是以任何方式压缩或优化。 有没有办法让它以较小的格式将图像存储在ram中? 我处在CPU方面比RAM更松弛的情况下,因此将图像对象的大小向下移向jpeg压缩的轻微性能损失将非常值得。

为什么我的线不画?

所以我已经定义了一个mouseEventlistener和mousemotionListener来定义点。 protected Point elementPosition = null; public Point endPoint = null; public Axis tempAxis; public Graphics g; class MouseButtonHandler extends MouseAdapter { public void mousePressed(MouseEvent e) { if(e.getModifiers()==InputEvent.BUTTON1_MASK) { elementPosition =new Point(e.getX(), e.getY()) ; if(addType==YLABEL) { YDialog ydia = new YDialog(anApp); ydia.setVisible(true); value =(double) ydia.getValue(); ydia.dispose(); } } } public void mouseReleased(MouseEvent e) { } […]