我创建了一个自定义形状,实际上它是四个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);
}
使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?
"给我
Verdana一个从上升到下降30像素高的大小."
我如何向Java询问此问题?
我写了一个应用程序,自定义绘制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);
    }
}
谢谢.
提前谢谢你的帮助
描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了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 …我想围绕它的中心点旋转一个矩形,它应该保留在它应该被绘制的位置并在该空间中旋转
这是我的代码:
AffineTransform transform = new AffineTransform();
    transform.rotate(Math.toRadians(45),rectangle.width/2, rectangle.height/2);
    Shape transformed = transform.createTransformedShape(rectangle);
    g2.fill(transformed)
旋转矩形但是在屏幕的不同部分绘制,我该如何纠正?
在JPanel我这样做的子类中:
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;        
    g2d.rotate(Math.toRadians(90.));
    g2d.drawString(aString, 40, -40);
}
字母正确旋转,但第二个字母不在第一个字母下方的预期位置(在其右侧,在旋转的空间中),但在其上方(在其左侧),第三个在上方(在左侧)该第二等改变旋转角度为45次的结果中的每个字符被旋转了45度的CW,如所预期,但字符的行被旋转45度CCW,这是与两个旋转中途是朝向结果为90度相一致.
在0度旋转时,文本正确显示.
我正在使用Mac OS X 10.8.2上的NetBeans 7.1.2进行开发.Win 7 SP1上的相同版本的NetBeans没有问题.
可能是什么导致了这个?
通常,例如,当我创建一个类时,Customer我会给它一些数据字段,即public int IdNumber;一些方法,即public String getName(){...}.但这就是它.我不能超越它并开始玩图形 - 我只能操纵和组织数据,只要类允许.
我无法理解JFrame中发生的事情.谁写了JFrame类,他们是怎么写一个可以让一个盒子出现在屏幕上的类?内部会发生什么导致这种情况发生?无论如何都要模仿它吗?
同样的问题适用于所有基于图形的Java类.我真的很想知道它是如何工作的,因为每次我使用其中一个都会困扰我.
在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);
}
但是,字体在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);
}
在设置子像素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没有渲染这些角色的原因是什么?这样的字体是否不受支持?或者这可能是一个错误?
我正在制作一个包含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)
        };
现在元素被实例化并加载到数组中,我使用这个方法来绘制它们:
public void paintComponent(Graphics g) {
            drawPie((Graphics2D) g, getBounds(),  pieValue);
        }
这个方法将元素放在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 = …我总是用这样的轮廓创建矩形(using Graphics(2D)):
g.setColor(aColor);
g.fillRect(x, y, width, height);
g.setColor(anotherColor);
g.drawRect(x, y, width, height);
这样可以正常工作,除了一些颜色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[] …