简体   繁体   中英

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);
        }
    }

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!

在此处输入图片说明在此处输入图片说明

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();
        }
    }
}

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM