Como posso definir no meio?

Eu tento desenhar um retângulo em Java. Eu configurei o tamanho do quadro (800.400) e redimensionável (falso) retangular x = 50, y = 50 largura = 700 altura = 300. Por que não está no meio? Obrigado.

Sem qualquer prova em contrário, eu acho que você substituiu o método de paint de algo como um JFrame e está pintando diretamente para ele.

O problema é que os frameworks têm decoração (uma borda e barra de título, por exemplo), que ocupa espaço dentro do quadro …

insira a descrição da imagem aqui

Tecnicamente, isso está correto. O retângulo é pintado no centro da moldura, mas devido às decorações da moldura, parece um pouco alto …

Em vez disso, você deve estar pintando na área de conteúdo do quadro.

insira a descrição da imagem aqui

Aqui o retângulo agora parece corretamente centrado. Em meus testes, eu defini o primeiro quadro (ruim) para 800×400, eu fiz o tamanho preferido do painel de conteúdo do segundo quadro 800×400, que fez o tamanho do quadro 816×438, como as decorações do quadro estão agora fora da área de pintura.

 public class CenterOfFrame { public static void main(String[] args) { new CenterOfFrame(); } public CenterOfFrame() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } new BadFrame().setVisible(true); JFrame goodFrame = new JFrame(); goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); goodFrame.setContentPane(new PaintablePane()); goodFrame.pack(); goodFrame.setLocationRelativeTo(null); goodFrame.setVisible(true); } }); } public class BadFrame extends JFrame { public BadFrame() { setSize(800, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void paint(Graphics g) { super.paint(g); paintTest(g, getWidth() - 1, getHeight() - 1); } } public void paintTest(Graphics g, int width, int height) { g.setColor(Color.RED); g.drawLine(0, 0, width, height); g.drawLine(width, 0, 0, height); g.drawRect(50, 50, width - 100, height - 100); } public class PaintablePane extends JPanel { @Override public Dimension getPreferredSize() { return new Dimension(800, 400); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //To change body of generated methods, choose Tools | Templates. paintTest(g, getWidth() - 1, getHeight() - 1); } } } 

Esta é uma das muitas razões pelas quais você não deve ignorar o método de paint dos contêineres de nível superior;)

  Rectangle rect = new Rectangle(50,50,700,300); 

Isso deve funcionar bem, você está criando uma nova instância do Rectangle antes de acessar as variables ​​de membro?

Também 800 por 400 é uma espécie de resolução estranha, 800 por 600 é mais padrão.