Размер и координаты 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);
}
}```