在画布上设置原点

Soc*_*nix 0 java awt

我正在尝试创建一个简单的绘图程序,并且我希望/需要原点位于左下角,因此我使用以下自定义画布:

public class GraphingCanvas extends Canvas {

    public GraphingCanvas() {

    }

    public void paint(Graphics g) {
        ((Graphics2D) g).translate(this.getWidth(), this.getHeight());
        g.translate(10, 10);
        g.setColor(Color.BLACK);
        g.drawLine(0, 0, 10, 10);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我使用这个画布时,就像这样:

private void initialize() {

    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    GraphingCanvas canvas = new GraphingCanvas();
    canvas.setBackground(Color.WHITE);
    canvas.setBounds(10, 10, 414, 241);
    frame.getContentPane().add(canvas);
}
Run Code Online (Sandbox Code Playgroud)

原点似乎保持为默认值。难道我做错了什么?

Mad*_*mer 5

这可能会或可能不会达到您想要的效果,但基本上我过去常常scale(1, -1)通过 y 轴翻转方向(并翻译上下文)

翻转

魔法基本上发生在paintComponent使用...的方法中。

g2d.scale(1, -1);
g2d.translate(0, -getHeight());
Run Code Online (Sandbox Code Playgroud)

可运行的例子...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Rectangle box = new Rectangle(10, 10, 20, 20);

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            draw(g2d, Color.RED, Color.MAGENTA);
            g2d.dispose();

            g2d = (Graphics2D) g.create();
            g2d.scale(1, -1);
            g2d.translate(0, -getHeight());
            draw(g2d, Color.BLUE, Color.GREEN);
            g2d.dispose();
        }

        protected void draw(Graphics2D g2d, Color boxColor, Color lineColor) {

            g2d.setColor(boxColor);
            g2d.fill(box);
            g2d.setColor(lineColor);
            g2d.drawLine(0, 0, getWidth(), getHeight());

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

为了确定起见,我创建了一个简单的方法......

protected void draw(Graphics2D g2d, Color boxColor, Color lineColor) {
    g2d.setColor(boxColor);
    g2d.fill(box);
    g2d.setColor(lineColor);
    g2d.drawLine(0, 0, getWidth(), getHeight());
}
Run Code Online (Sandbox Code Playgroud)

它以“正常”方向调用,然后以转换后的方向再次调用,因此它与用于绘制输出的代码相同,唯一改变的是方向