关于使用 Graphics 的 Java 坐标的问题。

huangapple go评论71阅读模式
英文:

Java questions about coordinates with Graphics

问题

如果我创建一个大小为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);
	}

}

这里可以看到程序运行时的效果

英文:

If I create a JFrame 800x600 pixels and draw a line from (0,0) to (800,600) it doesn't go from corner to corner, so, where is the (0,0) and where is the (800,600)?
Here is the code

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

答案1

得分: 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);
        }

    }

}

关于使用 Graphics 的 Java 坐标的问题。

英文:

If you want a drawing area that's 800 x 600 pixels, then set a drawing area that's 800 x 600 pixels. Who cares how big the frame is?

Here's a simple drawing GUI that I created. I made it 400 x 300 pixels so it would fit in the answer easier.

关于使用 Graphics 的 Java 坐标的问题。

Here's the code. It's a minimal, runnable example for setting the size of the drawing area.

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

得分: 0

以下是翻译好的内容:

JFrame 的大小和坐标计算包括装饰部分的大小,比如窗口的顶部包含带有关闭按钮的栏,其余部分包括在 Windows 上添加的额外轮廓(至少在 Ubuntu 上似乎没有添加额外的轮廓)。为了获得你想要的线条,你应该使用 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 的空间。Insets 类似乎在调用 setVisible(true) 时被“创建”,据我所知。所以这就是那部分代码的样子:

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);
    }
}
英文:

The JFrame size and coordinates count the size of the decorations, such as the top part of the window contains the bar with the close button, the rest contain the extra outline that is added on Windows(Ubuntu, at least, doesn't seem to add an extra outline). In order to get a line like you would want to, you should use JFrame.getInsets(), which returns the size of the GUI that decorates the JFrame, like this:


    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);
    }

Edit: this means that you don't have an actual 800x600 space. The Insets class seems to be "created" when setVisible(true) is called, as far as I can tell. So this would be how the code for that looks like:


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);
    }

}```

</details>



# 答案3
**得分**: 0

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

尝试在

    this.setVisible(true);

之前添加

    this.setUndecorated(true);


<details>
<summary>英文:</summary>

The window size should be defined without OS specific window decoration.

Try to add

    this.setUndecorated(true);

before the

    this.setVisible(true);

</details>



huangapple
  • 本文由 发表于 2020年4月8日 02:26:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/61086862.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定