Java вопросов о координатах с графикой - PullRequest
0 голосов
/ 07 апреля 2020

Если я создаю JFrame 800x600 пикселей и рисую линию от (0,0) до (800 600), она не go от угла к углу, поэтому где (0,0) и где это (800600)? Вот код

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

}

Здесь вы можете увидеть, что появляется при запуске программы

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Если вы хотите область рисования размером 800 x 600 пикселей, установите область рисования размером 800 x 600 пикселей. Кому интересно, насколько велика рамка?

Вот простой рисунок GUI, который я создал. Я сделал его размером 400 x 300 пикселей, чтобы он легче подходил к ответу.

Simple Drawing Panel

Вот код. Это минимальный, запускаемый пример для установки размера области рисования.

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

    }

}
0 голосов
/ 07 апреля 2020

Размер окна должен быть определен без указания ОС c оформление окна.

Попробуйте добавить

this.setUndecorated(true);

перед

this.setVisible(true);
0 голосов
/ 07 апреля 2020

Размер и координаты JFrame учитывают размер декораций, например, верхняя часть окна содержит панель с кнопкой закрытия, остальные содержат дополнительный контур, добавленный в Windows (Ubuntu, по крайней мере, не кажется, чтобы добавить дополнительную схему). Чтобы получить строку, как вы хотели бы, вы должны использовать JFrame.getInsets (), которая возвращает размер GUI, который украшает JFrame, например:


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

}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...