调整框架大小时保持圆居中

Keeping a circle centered when the frame is resized

我正在尝试编写一个程序,在 JFrame 的中心绘制一个圆,并使用 paintComponent 绘制圆。我的目标是即使调整了 JFrame 的大小,也能让圆在框架中居中。我尝试并搜索了不同的东西,但没有任何效果。我猜我必须使用 repaint() 和计时器,但不知道具体如何。我的代码如下:

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    int width = 40;
    int height = 40;
    int x;
    int y;

    JPanel panel = new JPanel() {
        private static final long serialVersionUID = 2L;
        public void paintComponent(Graphics g) {
            super.paintComponents(g);
          g.drawOval(x, y, width, height);
        }
    };

    public ImageFrame() {
        add(panel);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 300);
        x = (getWidth()/2) - (width/2)-20;
        y = (getHeight()/2) - (height/2)-40;
        setLocationRelativeTo(null);
        setVisible(true);
    }
}

更新:

我添加了 TrashGod 的方法,但它说要删除 @Override,然后如果 运行,JFrame 打开但没有圆圈。代码在下面,我已经从我的旧代码中编辑了 paintComponent

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageFrame extends JFrame implements {
    private static final long serialVersionUID = 1L;

    public ImageFrame() {
        addMouseListener(this);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        Dimension size = this.getSize();
        int d = 200;
        int x = (size.width - d) / 2;
        int y = (size.height - d) / 2;
        g.fillOval(x, y, d, d);
        g.setColor(Color.blue);
        g.drawOval(x, y, d, d);
    }
}

example centers the circle and adjusts the size to the smaller dimension, but you can make d constant. The essential step is to render relative to the panel's current size. Resize the enclosing frame to see the effect. Adding RenderingHints, seen ,使绘图窒息。

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        Dimension size = this.getSize();
        int d = 200;
        int x = (size.width - d) / 2;
        int y = (size.height - d) / 2;
        g.fillOval(x, y, d, d);
        g.setColor(Color.blue);
        g.drawOval(x, y, d, d);
    }

example 的更改:

$ diff OldSwingPaint.java SwingPaint.java 
38a39,41
>             Graphics2D g2d = (Graphics2D) g;
>             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
>                 RenderingHints.VALUE_ANTIALIAS_ON);
40c43
<             int d = Math.min(size.width, size.height) - 10;
---
>             int d = 200;