【问题标题】:Keeping a circle centered when the frame is resized调整框架大小时保持圆圈居中
【发布时间】:2016-08-05 03:29:29
【问题描述】:

我正在尝试制作一个在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 以圆为中心并将大小调整为较小的尺寸,但您可以使d 保持不变。
  • 您知道在调整框架大小时如何保持圆圈居中吗?这似乎是一项简单的任务,但我不知道该怎么做。
  • 我已经详细说明了below

标签: java swing jframe jpanel paintcomponent


【解决方案1】:

这个example 使圆居中并将大小调整为较小的尺寸,但您可以使d 保持不变。基本步骤是相对于面板的当前大小进行渲染。调整封闭框架的大小以查看效果。添加RenderingHints,看到here,会使绘图窒息。

    @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;

【讨论】:

  • 如何在我的代码中实现这一点?当调整框架大小时,这段代码是否保持圆圈大小相同?
  • 试试看。这是对example cited 的一行更改,设置int d = 200
  • 当我尝试使用它时,它说paintComponent有错误。
  • 请编辑您的问题以包含一个minimal reproducible example 来展示您描述的问题;包括错误和堆栈跟踪。
  • 很久以前发现这个问题的时候忘记把这个作为最佳答案了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多