¿Cómo puedo establecer en el medio?

Resuelto S Selin asked hace 11 años • 2 respuestas

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.

S Selin avatar Dec 06 '12 05:12 S Selin
Aceptado

Sin ninguna evidencia de lo contrario, supongo que has anulado el paintmétodo de algo como a JFramey 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...

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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 paintmétodo de los contenedores de nivel superior;)

MadProgrammer avatar Dec 05 '2012 23:12 MadProgrammer