标签: graphics2d

Java - 填充自定义形状

我创建了一个自定义形状,实际上它是四个Arc2D对象的集合.

当绘制这些弧线时,它们形成可以被认为是四点圆形星形,有点像三叶草.一个弧结束,另一个弧开始.他们在中心形成一个正方形.所以想象一下,拿一个正方形并在每一边画半圈.

我可以将这个形状绘制到Graphics2D对象,但是当我填充它时,它只会填充弧而不是中心正方形.填补这个内部广场是我的问题.

我已经实现了getPathIterator()下面的方法.我也实现了这些contains()方法.但它仍将只填补弧线.

我试着添加一个Rectangle.填充形状时,矩形/正方形将被正确填充,但它也会绘制矩形,这显然应该是预期的,但绝对不是理想的结果.

那么,有没有人对如何"填充"这样的形状有任何想法?

public PathIterator getPathIterator(AffineTransform at) {
    GeneralPath gp = new GeneralPath

    for (Arc2D arcs : this.arcs) {
        gp.append(arc, false);
    }

    return gp.getPathIterator(at);
}
Run Code Online (Sandbox Code Playgroud)

java swing awt graphics2d

6
推荐指数
1
解决办法
8388
查看次数

Java:获取具有特定高度(以像素为单位)的字体

使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?

"给我Verdana一个从上升到下降30像素高的大小."

我如何向Java询问此问题?

java fonts graphics2d fontmetrics

6
推荐指数
3
解决办法
1万
查看次数

调整图纸大小以匹配框架大小

我写了一个应用程序,自定义绘制paint()内的所有内容基于固定的像素位置.然后我禁用框架的大小调整,使其始终可见.

但是,现在我想能够调整它,但我不想改变我的绘制代码.我希望我可以抓住300x300平方的Graphics g对象并在我的所有绘制代码​​之后将其调整为JFrame当前大小,但我不知道我在做什么.

这里是示例代码.在这里,我希望100x100平方保持在中间,与调整大小的JFrame成比例:

package DrawAndScale;

import java.awt.Color;
import java.awt.Graphics;

public class DASFrame extends javax.swing.JFrame {
    public DASFrame() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        this.setSize(300, 300);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DASFrame().setVisible(true);
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fill3DRect(100, 100, 100, 100, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

java swing graphics2d

6
推荐指数
1
解决办法
8123
查看次数

Java BufferedImage使用不需要的背景颜色进行保存

提前谢谢你的帮助

描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了Frame.在构造函数中,该对象创建一个BufferedImage,并调用一个绘制到该图像上的方法.然后,它将图像显示在帧上.最后,它将图像保存到文件中(我不关心它使用的是什么格式).主程序创建对象,其余部分完成.

问题:保存的文件始终具有彩色背景!由于显示的图像很好,这尤其奇怪.如果我在ImageIO.write()中使用"jpg"格式,背景会偏红.如果我使用"png"格式,背景为深灰色.

我花了一段时间在这上面,我仍然不知道到底发生了什么!

    import java.awt.Frame ;
    import java.awt.image.BufferedImage ;
    import java.io.IOException ;
    import java.awt.event.WindowEvent ;
    import java.awt.event.WindowAdapter ;
    import java.awt.Toolkit ;
    import java.awt.Graphics2D ;
    import java.awt.Graphics ;
    import java.awt.Color ;
    import java.awt.Dimension ;
    import javax.imageio.ImageIO ;
    import java.io.File ;
    import java.awt.geom.Rectangle2D;

    public class HGrapher extends Frame{
       private BufferedImage img ;
       private float colors[][] ; //the colors for every rectangle
       private double availWidth ;
       private double availHeight ;


       public HGrapher(String saveFileName, int numRects) throws IOException {
          //*add window closer
          addWindowListener(new …
Run Code Online (Sandbox Code Playgroud)

java swing bufferedimage graphics2d javax.imageio

6
推荐指数
1
解决办法
5690
查看次数

java围绕中心旋转矩形

我想围绕它的中心点旋转一个矩形,它应该保留在它应该被绘制的位置并在该空间中旋转

这是我的代码:

AffineTransform transform = new AffineTransform();

    transform.rotate(Math.toRadians(45),rectangle.width/2, rectangle.height/2);
    Shape transformed = transform.createTransformedShape(rectangle);
    g2.fill(transformed)
Run Code Online (Sandbox Code Playgroud)

旋转矩形但是在屏幕的不同部分绘制,我该如何纠正?

java graphics rotation affinetransform graphics2d

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

Java旋转文本具有反转字符序列

JPanel我这样做的子类中:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;        
    g2d.rotate(Math.toRadians(90.));
    g2d.drawString(aString, 40, -40);
}
Run Code Online (Sandbox Code Playgroud)

字母正确旋转,但第二个字母不在第一个字母下方的预期位置(在其右侧,在旋转的空间中),但在其上方(在其左侧),第三个在上方(在左侧)该第二等改变旋转角度为45次的结果中的每个字符被旋转了45度的CW,如所预期,但字符的行被旋转45度CCW,这是与两个旋转中途是朝向结果为90度相一致.

在0度旋转时,文本正确显示.

我正在使用Mac OS X 10.8.2上的NetBeans 7.1.2进行开发.Win 7 SP1上的相同版本的NetBeans没有问题.

可能是什么导致了这个?

java text awt graphics2d

6
推荐指数
1
解决办法
1942
查看次数

JFrame如何工作?在内心深处,它如何绘制东西?

通常,例如,当我创建一个类时,Customer我会给它一些数据字段,即public int IdNumber;一些方法,即public String getName(){...}.但这就是它.我不能超越它并开始玩图形 - 我只能操纵和组织数据,只要类允许.

我无法理解JFrame中发生的事情.谁写了JFrame类,他们是怎么写一个可以让一个盒子出现在屏幕上的类?内部会发生什么导致这种情况发生?无论如何都要模仿它吗?

同样的问题适用于所有基于图形的Java类.我真的很想知道它是如何工作的,因为每次我使用其中一个都会困扰我.

java swing awt jframe graphics2d

6
推荐指数
1
解决办法
2439
查看次数

自Java 7u13以来,字体字形无法使用Graphics2D drawString呈现

在Windows 10上使用Java 32bit中的某些特定真实字体字体绘制字符串时,我遇到了一个奇怪的问题.

从Java 7u13开始,每当字体的字符/字形宽度超过其高度的4倍时,它就不会使用Graphics2D.drawString进行渲染(例如,字形4001em宽,基本字体大小为1000em):

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
    g2.drawString("XXXX", 10, 10);
}
Run Code Online (Sandbox Code Playgroud)

但是,字体在JLabel上正确呈现,因此在对底层Swing代码进行一些调查之后,我意识到将渲染提示KEY_TEXT_ANTIALIASING设置为VALUE_TEXT_ANTIALIAS_LCD_HRGB会使文本正确呈现:

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
    g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
    g2.drawString("XXXX", 10, 10);
}
Run Code Online (Sandbox Code Playgroud)

在设置子像素atialiasig并正确呈现字体后,渲染算法似乎有所不同.

如果我切换到Java 7u11或更早版本,文本呈现没有任何问题,并且没有设置VALUE_TEXT_ANTIALIAS_LCD_HRGB.

对于具有如此宽字形的任何其他字体也会发生同样的情况 - 例如,这个随机字体具有字符"J"的宽字形:http: //www.fontspace.com/digital-magic/hdgems5 - 它可以用Java 7u11渲染,但是没有任何比这更新的东西.

设置子像素抗锯齿VALUE_TEXT_ANTIALIAS_LCD_HRGB只是为了呈现字体看起来很丑陋,并不总是可行(例如,在使用第三方库时).有没有人知道自7u13以来awt没有渲染这些角色的原因是什么?这样的字体是否不受支持?或者这可能是一个错误?

java fonts swing glyph graphics2d

6
推荐指数
1
解决办法
287
查看次数

无法完成饼图的圆圈

我正在制作一个包含4个不同元素的饼图.我可以让元素出现在JFrame中,但我无法完成饼图圈.这些是元素:

public static class PieChart extends JComponent { 

        IAPieChart[] pieValue = {new IAPieChart(5, Color.green),
                                new IAPieChart(4, Color.orange),
                                new IAPieChart(3, Color.blue),
                                new IAPieChart(2, Color.red)

        };
Run Code Online (Sandbox Code Playgroud)

现在元素被实例化并加载到数组中,我使用这个方法来绘制它们:

public void paintComponent(Graphics g) {

            drawPie((Graphics2D) g, getBounds(),  pieValue);

        }
Run Code Online (Sandbox Code Playgroud)

这个方法将元素放在JFrame上,但只给了我大约120度的圆.:

void drawPie(Graphics2D g, Rectangle area, IAPieChart[] pieValue){

            double sum = 0.0;
            for (int i = 0; i < pieValue.length; i++) {

                sum += pieValue[i].arcValue;
            }

            double endPoint =  0.0D;
            int arcStart = 0; 
            for (int i = 0; i < pieValue.length; i++){

                endPoint = …
Run Code Online (Sandbox Code Playgroud)

java swing graphics2d pie-chart

5
推荐指数
1
解决办法
834
查看次数

drawRect()在某些颜色上无法正常工作

我总是用这样的轮廓创建矩形(using Graphics(2D)):

g.setColor(aColor);
g.fillRect(x, y, width, height);
g.setColor(anotherColor);
g.drawRect(x, y, width, height);
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,除了一些颜色Color.BLUE.有些线条的厚度不同:

在此输入图像描述

第一眼看上去可能很难看,但如果仔细观察,你会发现左边的线太粗而右边太细.这种情况也会发生在其他颜色上,但不是那么明显:(我仍然不确定这是否会发生青色,无法准确判断)

在此输入图像描述

我无法理解这一点,因为黑线只是被绘制在内部蓝色矩形上,内部矩形不会对它产生影响.(没有fillRect()线条甚至厚度)

我在下面提供了一个示例,可能会帮助您更好地了解差异.我的问题:为什么会出现某些RGB颜色,我该如何解决?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;

public class LineExample {

    Color colors[] = new Color[] { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
            Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW };
    String colorNames[] = new String[] …
Run Code Online (Sandbox Code Playgroud)

java swing graphics2d

5
推荐指数
1
解决办法
456
查看次数