Sarah Szabo
Sarah Szabo

Reputation: 10815

Component Paint method not painting to middle of JPanel?

Alright, so I have a JPanel with the paint method below, and it works just fine at first, but when the JPanel is resized(is in JFrame) is doesn't paint it to the center of the Frame.

 @Override
    protected void paintComponent(Graphics g) {
        Graphics2D graphics = (Graphics2D) g;
        Dimension dimension = frame.getSize();
        Insets insets = getInsets();
        int w = (int) ((dimension.getWidth() - insets.left - insets.right) / 2);
        int h = (int) ((dimension.getHeight() - insets.top - insets.bottom) / 2);
        graphics.translate(w, h);
        graphics.drawString("Origin", 0, 0);
        double y = 0;
        for (double x = -25; x <= 25; x += .01) {
            y = -Math.pow(x, 2);
            int gx = (int) x;
            int gy = (int) y;
            System.out.println("Parabola Coordinate: " + x + ", " + y);
            g.drawRect(gx, gy, 0, 0);
        }
    }

Upvotes: 0

Views: 1905

Answers (2)

camickr
camickr

Reputation: 324118

The size of the painting area should be based on the size of the panel not the frame:

//Dimension dimension = frame.getSize();
Dimension dimension = getSize();

Also if you want to center a painting then you need to know the size of the painting. So for example the height will range from -625 to 0. You need to take into account the maximum size of 625 for the height so to center on the y axis the code should be:

int h = (int) ((dimension.getHeight() - insets.top - insets.bottom - 625) / 2);

Also, because the calculated values are all negative, you need to do an additional translation to make sure the coordinates are all positive. So the translate would be:

graphics.translate(w, h + 625);

The same basic logic will apply for the horizontal translation as well.

Upvotes: 0

MadProgrammer
MadProgrammer

Reputation: 347204

Change your paintComponent to look more like

@Override
protected void paintComponent(Graphics g) {
    // Create a copy of the graphics context...
    Graphics2D graphics = (Graphics2D) g.create();
    // Don't rely on the frame, rely on your own components size...
    //Dimension dimension = frame.getSize();
    Insets insets = getInsets();
    int w = (int) ((getWidth() - insets.left - insets.right) / 2);
    int h = (int) ((getHeight() - insets.top - insets.bottom) / 2);
    graphics.translate(w, h);
    graphics.drawString("Origin", 0, 0);
    double y = 0;
    for (double x = -25; x <= 25; x += .01) {
        y = -Math.pow(x, 2);
        int gx = (int) x;
        int gy = (int) y;
        System.out.println("Parabola Coordinate: " + x + ", " + y);
        // You were using the "un-translated" reference, don't know if that was deliberate
        graphics.drawRect(gx, gy, 0, 0);
    }
    // Dispose of the copy and safe resources...
    graphics.dispose();
}

Make sure you're also using a suitable layout manager!

enter image description hereenter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BadPaint21 {

    public static void main(String[] args) {
        new BadPaint21();
    }

    public BadPaint21() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D graphics = (Graphics2D) g.create();
//            Dimension dimension = frame.getSize();
            Insets insets = getInsets();
            int w = (int) ((getWidth() - insets.left - insets.right) / 2);
            int h = (int) ((getHeight() - insets.top - insets.bottom) / 2);
            graphics.translate(w, h);
            graphics.drawString("Origin", 0, 0);
            double y = 0;
            for (double x = -25; x <= 25; x += .01) {
                y = -Math.pow(x, 2);
                int gx = (int) x;
                int gy = (int) y;
                System.out.println("Parabola Coordinate: " + x + ", " + y);
                graphics.drawRect(gx, gy, 0, 0);
            }
            graphics.dispose();
        }
    }
}

Upvotes: 4

Related Questions