【问题标题】:How to I make a simple window that I can render to?如何制作一个可以渲染的简单窗口?
【发布时间】:2013-11-28 10:27:51
【问题描述】:

我刚刚完成了一个 2D 矢量/转换库,我想在一个简单的示例中使用它。我有一个有效运行的主循环和更新/渲染方法。我一直试图理解人们在使用 Java2D 或 jPanels 或 jFrames 时在谈论什么,但这些对我来说毫无意义。

我之前制作了一些 2D 示例,但它使用的是带有线程画布的 jFrame,这是我在遵循 youtube 教程时制作的。它的问题是它基本上是一个允许单独像素设置的整数数组,你只能使用整数作为位置,而不是像我的库那样使用浮点数。

所以我的问题是:我将如何制作一个简单的打开/关闭窗口,以便我可以绘制一个精灵(精灵应该只是某种 slickUtil 加载的东西,还是我必须加载单个像素,因为我以前做过吗?)to,并且接受以中心为原点的笛卡尔坐标的浮点值。

【问题讨论】:

    标签: java swing vector 2d transformation


    【解决方案1】:

    从 JComponent 派生一个类并覆盖 paintComponent 方法。它传递了一个可以转换为 Graphics2D 对象的 Graphics 对象。后者支持更改坐标系。

    对于绘制精灵:循环加载单个像素非常慢。在 Graphics2D 中有一个 drawImage 方法,它支持你对精灵进行 blitting 所需的一切。

    这是一个在自包含示例中设置具有居中原点的 Graphics2D 对象的示例:

    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.Line2D;
    
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    public class Draw2D extends JFrame {
        public Draw2D() {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLayout(new BorderLayout());
            add(new DrawPane(), BorderLayout.CENTER);
            pack();
        }
    
        public static void main(String[] args) {
            Draw2D drawing = new Draw2D();
            drawing.setVisible(true);
        }
    }
    
    class DrawPane extends JComponent {
        public DrawPane() {
            setPreferredSize(new Dimension(640, 640));
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
    
            // use anti-aliasing for smooth lines
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
            // move origin to center
            g2.translate(getWidth() / 2, getHeight() / 2);
    
            // scale as you need. Using negative y so that y points upward
            // note that non-square window sizes will cause a different aspect ratio,
            // you probably want to use Math.min(width, height) or something
            g2.scale(getWidth() / 2, -getHeight() / 2);
    
            // set color and thickness
            g2.setColor(Color.red);
            g2.setStroke(new BasicStroke(0.001f));
    
            // draw coordinate lines
            g2.draw(new Line2D.Float(-1f, 0f, 1.0f, 0f));
            g2.draw(new Line2D.Float(0, -1.0f, 0.0f, 1.0f));
    
            // draw a vector
            g2.draw(new Line2D.Float(0f, 0f, 0.25f, 0.25f));
        }
    }
    

    【讨论】:

    • 是的,Graphics 对象和 JPanel 等的整个想法我一无所知。我可以阅读在线文档,尝试一下,复制出来等等我想要的一切,但我从来没有得到任何显示。
    • 如果您愿意举个例子,我将不胜感激,我是否需要上传我的源代码,或者我是否已经足够清楚地解释了我所拥有的?
    • 添加了示例。适合您的需要吗?
    • 我更新了示例以添加更多线条并打开抗锯齿以获得更平滑的线条。要添加更多内容,您可以使用循环创建在 paintComponent 方法中绘制的 Shape 对象列表。您可以在 paint 方法之外更改列表并调用 repaint() 来更新绘图。
    • “这很好,所以现在是提问时间:)” 如果“现在”是时间,那么 3 小时前的帖子到底是什么?您似乎将其视为“一站式修复我的代码商店”。不是这样的。这是一个问答网站,理想的情况是每个线程一个 Q 和一个 A。请accept回答并提出新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2019-06-27
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2018-02-23
    相关资源
    最近更新 更多