【问题标题】:Java questions about coordinates with Graphics关于图形坐标的Java问题
【发布时间】:2020-04-07 18:26:17
【问题描述】:

如果我创建一个 800x600 像素的 JFrame 并从 (0,0) 到 (800,600) 画一条线,它不会从一个角到另一个角,那么,(0,0) 和 (800,600) 在哪里)? 这是代码

import java.awt.Graphics;

import javax.swing.JFrame;

public class Point0_0test extends JFrame {

    public Point0_0test() {
        setTitle("Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(0, 0, 800, 600);
    }

    public static void main(String[] args) {
        Point0_0test test = new Point0_0test();
        test.setVisible(true);
    }

}

Here you can see what appears when the program is running

【问题讨论】:

    标签: java graphics


    【解决方案1】:

    如果您想要一个 800 x 600 像素的绘图区域,请设置一个 800 x 600 像素的绘图区域。谁在乎框架有多大?

    这是我创建的一个简单的绘图 GUI。我将其设置为 400 x 300 像素,以便更容易融入答案。

    这是代码。这是一个用于设置绘图区域大小的最小可运行示例。

    import java.awt.BasicStroke;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class SimpleDrawingArea implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new SimpleDrawingArea());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Simple Drawing Panel");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new DrawingPanel());
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public class DrawingPanel extends JPanel {
    
            private static final long serialVersionUID = 1L;
    
            public DrawingPanel() {
                this.setPreferredSize(new Dimension(400, 300));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setStroke(new BasicStroke(4f));
                g2d.drawLine(0, 0, 400, 300);
            }
    
        }
    
    }
    

    【讨论】:

    • 这是另一种方式。也许甚至是更清洁的。非常感谢!
    【解决方案2】:

    JFrame 大小和坐标计算装饰的大小,例如窗口的顶部包含带有关闭按钮的栏,其余部分包含在 Windows 上添加的额外轮廓(至少 Ubuntu 没有t 似乎添加了一个额外的轮廓)。为了获得您想要的线条,您应该使用 JFrame.getInsets(),它返回装饰 JFrame 的 GUI 的大小,如下所示:

    
        import java.awt.Insets;
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Insets in = getInsets();
            g.drawLine(in.left, in.top, 800-in.right, 600-in.bottom);
        }
    

    编辑:这意味着您没有实际的 800x600 空间。据我所知,当调用 setVisible(true) 时,Insets 类似乎是“创建”的。所以这将是代码的样子:

    
    import javax.swing.JFrame;
    import java.awt.Insets;
    import java.awt.Graphics;
    
    public class InsetsTest extends JFrame {
    
        public InsetsTest() {
            super();
            setTitle("Test");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(800,600);
            setVisible(true);
            Insets insets= getInsets();
            setSize(800+insets.right+insets.left,600+insets.top+insets.bottom);
    
            setLocationRelativeTo(null);
        }
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Insets in = getInsets();
            g.drawLine(in.left, in.top, 800+in.left, 600+in.top);
        }
    
        public static void main(String[] args) {
            InsetsTest test = new InsetsTest();
            test.setVisible(true);
        }
    
    }```
    

    【讨论】:

    • 哦,谢谢!但是现在我很好奇所以我使用了System.out.println("(" + insets.left + "," + insets.top + ")"); System.out.println("(" + insets.right + "," + insets.bottom + ")"); 我得到了 (8,31) (8,8) 如果它在右下角,为什么我不得到 (8,31) (800,600)?
    • Insets 返回的更像是装饰物本身的大小,而不是坐标。我现在用一个稍微好一点的解释编辑了我的答案。
    • 等等。这意味着我必须绘制的空间不是 800 x 600,而是 800-insets.right-insets.left x 600-insets.top-insets.bottom。如何获得 800x600 的真实空间。我是使用setSize(800+insets.right+insets.left,600+insets.top+insets.bottom) 还是在声明大小时创建插图?
    • 插图似乎是在调用 setVisible(true) 时创建的......据我所知。
    • 做了一个快速测试,似乎正如你所说,是在setVisible(true)之后创建的
    【解决方案3】:

    窗口大小应该在没有操作系统特定窗口装饰的情况下定义。

    尝试添加

    this.setUndecorated(true);
    

    之前

    this.setVisible(true);
    

    【讨论】:

    • 这也有效,但我没有得到用于关闭和最小化的顶部栏,我认为这是一个非常有用的栏。但是感谢您的帮助,我真的很感激!
    猜你喜欢
    • 2021-04-10
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2019-12-30
    • 2018-11-16
    相关资源
    最近更新 更多