如何在Graphics2D中设置所需的坐标

时间:2013-05-14 01:56:59

标签: java swing graphics2d

我想设置一个数学(其中y不长大)坐标空间从(-1,-1)到(+ 1,+ 1)并使其适合窗口而不管窗口大小。< / p>

我在Java SE 7中使用匿名JComponent子类,并将Graphics中的传入paintComponent转换为Graphics2D,然后绘制Graphics2D

Graphics2D设置为随窗口大小而变化的计算机坐标空间。如何让它根据窗口大小重新缩放并让Y向上移动?以下程序应在右上象限中显示黑色方块。

import java.awt.Graphics;
import java.awt.Graphics2D;
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());
    frame.setUndecorated(true);
    JComponent component = new JComponent() {
      private static final long serialVersionUID = 1L;
      @Override
      protected void paintComponent (Graphics g) {
        super.paintComponent(g);
        paint2D((Graphics2D)g);
      }
      protected void paint2D (Graphics2D g2) {
        g2.draw(new Rectangle2D.Double(0.1, 0.1, 0.9, 0.9));
      }
    };
    frame.add(component);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
  }
}

1 个答案:

答案 0 :(得分:5)

使用transform()translate()设置坐标系统的方式。所以:

  1. 你希望原点在(0,高度);左下角。
  2. 然后你要翻转Y轴。
  3. 示例代码:

    AffineTransform tform = AffineTransform.getTranslateInstance( 0, height);
    tform.scale( 1, -1);
    g2.setTransform( tform);
    

    [我的编辑版]:

    public static void main (String [] args) {
        JFrame frame = new JFrame( G2dTransform_Question.class.getCanonicalName());
        JComponent component = new JComponent() {
            private static final long serialVersionUID = 1L;
            @Override
            protected void paintComponent (Graphics g) {
                super.paintComponent(g);
                paint2D((Graphics2D)g);
            }
            protected void paint2D (Graphics2D g2) {
                AffineTransform tform = AffineTransform.getTranslateInstance( 0, getHeight());
                tform.scale( getWidth(), -getHeight());    // NOTE -- to make 1.0 'full width'.
                g2.setTransform( tform);
    
                g2.setColor( Color.BLUE);  // NOTE -- so we can *see* something.
                g2.fill( new Rectangle2D.Double(0.1, 0.1, 0.8, 0.8));  // NOTE -- 'fill' works better than 'draw'.
            }
        };
    
        frame.setLayout( new BorderLayout());    // NOTE -- make the component size to frame.
        frame.add( component, BorderLayout.CENTER);
    
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
    

    [Hovercraft的版本]:谢谢Hover!

    import java.awt.Dimension;
    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 final int PREF_W = 400;
      public static final int PREF_H = PREF_W;
    
    public static void main (String [] args) {
        JFrame frame = new JFrame(G.class.getCanonicalName());
        frame.setUndecorated(true);
        JComponent component = new JComponent() {
          private static final long serialVersionUID = 1L;
          @Override
          protected void paintComponent (Graphics g) {
            super.paintComponent(g);
            AffineTransform tform = AffineTransform.getTranslateInstance( 0, getHeight());
            tform.scale( 1, -1);
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setTransform( tform);
            paint2D(g2);
            g2.dispose();
          }
          protected void paint2D (Graphics2D g2) {
            g2.draw(new Rectangle2D.Double(10, 10, 20, 30));
          }
    
          @Override
          public Dimension getPreferredSize() {
             return new Dimension(PREF_W, PREF_H);
          }
        };
        frame.add(component);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
      }
    }