¿Cómo puedo establecer en el medio?
Intento dibujar un rectangular en Java. Configuré el tamaño del marco (800,400) y el tamaño rectangular (falso) x = 50, y = 50 ancho = 700 alto = 300. ¿Por qué no está en el medio? Gracias.
Sin ninguna evidencia de lo contrario, supongo que has anulado el paint
método de algo como a JFrame
y estás pintando directamente sobre él.
El problema es que los marcos tienen decoración (un borde y una barra de título, por ejemplo), que ocupa espacio dentro del marco...
Técnicamente, esto es correcto. El rectángulo está pintado en el centro del marco, pero debido a las decoraciones del marco, parece que está ligeramente alto...
En su lugar, deberías pintar en el área de contenido del marco.
Aquí el rectángulo ahora parece correctamente centrado. En mis pruebas, configuré el primer fotograma (malo) en 800x400, hice que el tamaño preferido del panel de contenido del segundo fotograma fuera 800x400, lo que hizo que el tamaño del fotograma fuera en realidad 816x438, ya que las decoraciones del fotograma ahora están fuera del á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 es una de las muchas razones por las que no debes anular el paint
método de los contenedores de nivel superior;)