java - Graphics2D 是后现代的

标签 java swing graphics graphics2d

在以下代码中,将 fill 更改为 draw 会产生意外结果。附图展示了绘制红色和绿色矩形所造成的不受欢迎但备受赞赏的后现代效果。

仿射变换不应该是问题的一部分,但正如福尔摩斯所说,一旦你排除了所有其他可能性......所以,我将解释变换。我解决了一堆方程,以弄清楚如何使窗口显示笛卡尔坐标系,左下角带有 (-2, -2)(+2, +2) 位于右上角。

这是一个独立的示例。尝试将任何draw更改为fill,反之亦然,以实现您自己的自定义艺术,您可以在Oracle办公室中将其框起来。

我使用的是 Java SE 7、JDK 1.7.0_21!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

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

public class G {

  public static void main (String [] args) {
    JFrame frame = new JFrame(G.class.getCanonicalName());
    JComponent component = new JComponent() {
      private static final long serialVersionUID = 1L;

      @Override
      protected void paintComponent (Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        AffineTransform xform = new AffineTransform(getWidth() / 4, 0, 0, - getHeight() / 4, getWidth() / 2, getHeight() / 2);
        g2.setTransform(xform);
        paint2D(g2);
        g2.dispose();
      }

      protected void paint2D (Graphics2D g2) {
        g2.setColor(Color.RED);
        g2.draw(new Rectangle2D.Double( 0,  0, 1, 1));
        g2.setColor(Color.GREEN);
        g2.draw(new Rectangle2D.Double(-1, -1, 1, 1));
        g2.setColor(Color.BLUE);
        g2.fill(new Rectangle2D.Double(-1,  0, 1, 1));
        g2.setColor(Color.YELLOW);
        g2.fill(new Rectangle2D.Double( 0, -1, 1, 1));
      }
    };
    frame.setLayout(new BorderLayout());
    frame.add(component, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
  }
}

graphics2_postmodern.png

最佳答案

这是 1 单位的默认笔划设置。我将每个维度的坐标空间从 -20 增加到 +20 并绘制了 10 单位宽和高的矩形,这确认了问题与图像相同下面显示。

less modern

关于java - Graphics2D 是后现代的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16535904/

相关文章:

java - JPanel 不显示按钮

java - 有什么办法可以让 BorderLayout 东、南、西边框变大吗?

c++ - 阐明 glFrustum,以及为什么我看不到图像

java - 匹配域中除查询之外的所有 url

java - 我想检索联系人的联系人照片。我该怎么做?

java - 如何将 ComboBoxCellEditor 设为只读?

java - 我有一个要转换为 ArrayList<String> 的 ArrayList<JCheckBox>

java - 为什么这个 RadialGradientPaint 绘制不正确?

java - 使用 Canvas 在 Java 中绘图

java - 在 Servlet 类中创建方法是一种不好的做法吗?