标签: graphics2d

使用JUnit测试图形生成

我正在使用Java的Graphics2D来生成图形的图形表示.我也在使用ImageIO来编写PNG文件.(ImageIO.write(image, "png", out);)

我想知道如何编写JUnit测试来测试生成的图形是否符合预期.我可以预先生成PNG文件,但如果在不同的机器上字体有点不同怎么办?

java junit graphics2d

8
推荐指数
1
解决办法
2526
查看次数

在Java中重置Graphics2D对象

我在Java中尝试使用Graphics2D.但像往常一样,我被困住了.:P问题是:假设我有这个代码,

Graphics2D g=(Graphics2D)(this.getGraphics()); //Inside a JFrame
g.rotate(Math.PI/8);
g.drawLine(10, 20, 65, 80);

//I want this one and all following lines to be drawn without any rotation
g.drawLine(120, 220, 625, 180);
Run Code Online (Sandbox Code Playgroud)

可能吗???我知道必须有某种方式,但我无法弄清楚.请帮忙.

java swing graphics2d

8
推荐指数
2
解决办法
6778
查看次数

如何在Java2D/Graphics2D中指定回退字体

我正在用g.drawString(str, x, y)一个Graphics2D对象绘制一个String g.当前的字体g不包括所有字符str(我在那里有例如中文字符).在Mac OS X上,似乎会自动使用后备字体,但不会在Windows上显示黑色方形轮廓,而不是所需的字符.

  • 为什么行为会因平台而异?
  • 如果字符丢失,如何指定后备字体(或多种后备字体)?

(例如,那里有一个很好的字体.)

更新/更多信息

因此,不支持所有字符的原始字体不是JVM的逻辑字体之一,而是我的应用程序随附的捆绑字体Font.createFont().因此,将字体添加到JRE的lib/fonts/fallback文件夹在此处不起作用.

java fonts fallback java-2d graphics2d

8
推荐指数
1
解决办法
2070
查看次数

paintComponent在绘图之上绘制其他组件

我正在尝试构建一个简单的绘图工具.该mouseDrag事件创建一个新的椭圆形,并导致我JPanelrepaint().

这到目前为止工作正常.但是,如果我mouseDrag在第一次触发事件之前按下任何按钮(或任何其他UI组件),则按钮将绘制在我面板的左上角.

我已将代码隔离到此测试应用程序中:

import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame
{
    public Test()
    {
        final JPanel paintPanel = new JPanel(){
            @Override
            protected void paintComponent(Graphics g)
            {
                Graphics2D g2d = (Graphics2D)g;
                g2d.setPaintMode();

                g2d.setStroke(new BasicStroke(1));
                g2d.fillRect(100, 100, 10, 10);
            }
        };

        paintPanel.setPreferredSize(new Dimension(300,300));
        paintPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                paintPanel.repaint();
            }
        });

        this.setLayout(new …
Run Code Online (Sandbox Code Playgroud)

java swing repaint graphics2d paintcomponent

8
推荐指数
2
解决办法
4634
查看次数

如何创建Graphics2D实例?

Java SE 7中获取实例的最简单方法是绘制几个点进行调试?桌面环境.

java awt graphics2d

8
推荐指数
2
解决办法
2万
查看次数

用Java绘制像素图像

哪种方法是使用java创建像素图像的最佳方法.比如,我想创建一个尺寸为200x200的像素图像,总共为40.000像素.如何从随机颜色创建像素并将其渲染到JFrame上的给定位置.

我试图创建一个只创建像素的自己的组件,但是如果我使用for循环创建这样一个像素250,000次并将每个实例添加到JPanels布局中,这似乎不是非常高效.

class Pixel extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(getRandomColor());
        g.fillRect(0, 0, 1, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

java swing pixel graphics2d paintcomponent

7
推荐指数
2
解决办法
2万
查看次数

使用矩阵单独旋转矩形

有一点绘图复杂,你会称之为.当谈到矩阵并在形状上绘制旋转时,我的数学有点生疏.这是一些代码:

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        g = e.Graphics;
        g.SmoothingMode = SmoothingMode.HighQuality;
        DoRotation(e);
        g.DrawRectangle(new Pen(Color.Black), r1);
        g.DrawRectangle(new Pen(Color.Black), r2);

        // draw a line (PEN, CenterOfObject(X, Y), endpoint(X,Y) )
        g.DrawLine(new Pen(Color.Black), new Point((r1.X + 50), (r1.Y + 75)), new Point((/*r1.X + */50), (/*r1.Y - */25)));

        this.lblPoint.Text = "X-pos: " + r1.X + " Y-pos: " + r1.Y;

        //this.Invalidate();
    }
    public void DoRotation(PaintEventArgs e)
    {
        // move the rotation point to the center of object
        e.Graphics.TranslateTransform((r1.X + 50), (r1.Y + …
Run Code Online (Sandbox Code Playgroud)

c# math gdi+ graphics2d winforms

7
推荐指数
1
解决办法
2万
查看次数

Graphics2D转换结果与手动转换不匹配

我使用Java的Graphics2D在一个组件上使用AffineTransform来操作我的绘图.Graphics2D为此提供了一个方法转换,它采用了AffineTransform.

有时我需要手动操作一个点而不使用内置转换.但是当我尝试使用相同的变换转换一个点时,我给了Graphics2D.transform有时结果点不一样.

下面的代码重现了这个问题(它是Scala代码,但我认为你可以想象Java代码.):

   var transformationMatrix = new AffineTransform()
   /*
    * transformationMatrix is modified throughout the program
    * ...
    */
   override def paintComponent(g: Graphics2D) = {
      super.paintComponent(g)
      /* 1. transform using graphics transform */
      g.transform(transformationMatrix)
      g.setColor(Color.RED)
      g.fill(new Rectangle(0, 0, 1, 1))
      /* 2. transform point manually */
      g.setTransform(new AffineTransform) // reset transformation to standard
      val p0 = new Point(0, 0)
      val pDest = new Point()
      transformationMatrix.transform(p0, pDest)
      g.setColor(Color.BLUE)
      g.fill(new Rectangle(pDest.x, pDest.y, 1, 1)
   }
Run Code Online (Sandbox Code Playgroud)

预期的行为

蓝色矩形(手动计算)透过红色矩形(通过变换计算).

经验丰富的行为

蓝色矩形的偏移量为1

我承认我的transformationMatrix并不是真正的整数,但那应该不是问题,不是吗?

   affineTransform = 1.1, …
Run Code Online (Sandbox Code Playgroud)

java swing scala transform graphics2d

7
推荐指数
2
解决办法
690
查看次数

如何有效地实现java.awt.Composite?

背景:我需要能够以"禁用"外观创建图像.通常建议的方法是将图像转换为灰度并显示灰度图像.缺点是它只适用于图像,因此显示图形很麻烦,因为您无法立即访问处于禁用状态的图像.现在我认为这可以使用java.awt.Composite动态完成(然后我不需要知道如何实现一个Icon来禁用它).似乎没有实现转换为灰度,所以我必须创建自己的......

也就是说,我将一个实现混合在一起(并且它呈现了我所期望的).但我不确定它是否真的适用于所有情况(复合/ CompositeContext的Javadocs对于这样一个复杂的操作看起来非常薄).正如你从我的实现中看到的那样,我采用了一种迂回的方式来逐像素处理,因为似乎没有简单的方法来批量读取/写入像素,而这种格式不是由所涉及的栅格决定的.

欢迎任何指向更广泛的文档/示例/提示的指针.

这是SSCCE - 它通过DisabledComposite渲染(彩色)GradientPaint,将渐变转换为灰度.请注意,在现实世界中,您将无法知道通过哪些调用呈现的内容.Gradient实际上只是一个例子(对不起,但是人们常常没有这样做,所以这次我会明确说明).

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CompositeSSCE implements Runnable {

    static class DisabledComposite implements Composite {
        @Override
        public CompositeContext createContext(
            final ColorModel srcColorModel,
            final ColorModel dstColorModel,
            final RenderingHints hints) {
            return new DisabledCompositeContext(srcColorModel, dstColorModel);
        }
    } 

    static class DisabledCompositeContext implements CompositeContext {

        private …
Run Code Online (Sandbox Code Playgroud)

java graphics image awt graphics2d

7
推荐指数
1
解决办法
1275
查看次数

带有TexturePaint的图标会抛出InternalError:Surface无法缓存

我有一个自定义Icon其使用TexturePaint的油漆,并调用fillPolygon一个上Graphics2D对象.

这段代码在JDK6和JDK7上运行良好,但在64位Linux的JDK8下失败(在64位Linux上尝试了最新的JDK1.8).在Windows上,这适用于JDK8.

java -version用于重现问题的JDK命令的输出.

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)

重现问题的代码:

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class TexturePaintIconTest {

  private static class CustomIcon implements Icon{

    private static final int[] sXArray = new int[]{2, 5, 7, 12, 12, 4, 1, 1, 2};
    private static final int[] sYArray = new int[]{4, 4, 2, 2, 11, 11, 8, 5, 4}; …
Run Code Online (Sandbox Code Playgroud)

java swing awt java-2d graphics2d

7
推荐指数
1
解决办法
199
查看次数

标签 统计

graphics2d ×10

java ×9

swing ×5

awt ×3

java-2d ×2

paintcomponent ×2

c# ×1

fallback ×1

fonts ×1

gdi+ ×1

graphics ×1

image ×1

junit ×1

math ×1

pixel ×1

repaint ×1

scala ×1

transform ×1

winforms ×1