【问题标题】:JAVA - creating basic 2D shapes that scale to window sizeJAVA - 创建可缩放到窗口大小的基本 2D 形状
【发布时间】:2016-10-16 20:03:07
【问题描述】:

我正在尝试通过阅读我在网上找到的教科书中的示例来学习 Java。我能够很容易地在书中做一个例子,但我想更进一步。当我为一个名为“同心圆”的程序编写代码时,我注意到我的圆圈没有缩放到窗口的大小,我认为它看起来很糟糕(如果我把窗口做得太小,圆圈就不会缩放,你只看到一个圆圈。我调整了我的代码,它似乎有点缩放但是当我让我的窗口太小或太大时看起来很糟糕。我希望我的 12 个圆圈适合窗口大小,无论大小窗户。我觉得我离它很近,但似乎无法绕开它。任何和所有的帮助都非常感谢,在此先感谢!

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

public class Circles extends JPanel
{

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        int width = getWidth();
        int height = getHeight();
        int x = width / 12;
        int y = height / 12;
        int buffersize = 0;

        for (int i = 0; i < 12; i++)
        {
            g.drawOval(width / 2 - buffersize, height / 2 - buffersize, x + buffersize * 2, y + buffersize * 2);
            buffersize += 10;
        }
    }
}

驱动类

import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author
 */
public class ConcentricCirclesTest 
{
    public static void main(String[] args)
    {
        //create a panel that will contain our drawing
        Circles panel = new Circles();

        //create a new frame to house the panel
        JFrame application = new JFrame();

        //set the frame to exit when closed
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.add(panel);
        application.setSize(350, 350);
        application.setVisible(true);

    }

}

【问题讨论】:

  • “看起来很糟糕”是什么意思?发生了什么事?
  • 抱歉含糊不清。如果我把窗口做得太小,圆圈会比窗口大,你只能看到图像的一部分。我希望每个圆圈彼此成比例,但与窗口大小保持一致。
  • 您能告诉我们如何将面板添加到窗口吗?
  • 当然,我编辑了帖子并添加了驱动程序类。

标签: java jframe window jpanel scale


【解决方案1】:

如果您希望您的圆圈是圆形的(不是椭圆形的),那么首先您需要知道哪个更窄,宽度或高度。使用if...else 的语法快捷方式,你会想要这样的东西:

int smallest = width < height ? width : height;

接下来,您需要考虑您的圈子之间的距离。如果您只有 100 个像素来绘制它们,那么尝试绘制 12 个变大(或变小)10 个像素的圆圈是没有好处的。同样,如果您有 500 个像素的空间。就像这样:

float spacing = smallest / 12f;

请注意,将一个int 与另一个分开可能会得到意想不到的结果。 然后在您的for 循环中:

g.drawOval(0 + ((spacing / 2) * i), 0 + ((spacing / 2) * i), 
           smallest - ((spacing / 2) * i), smallest - ((spacing / 2) * i));

我希望这是清楚的。基本上,边界矩形(或正方形)每次迭代都会变小spacing。

好的,这将需要 tweeking,因此它不会在左下角绘制,我认为最后一个圆圈将是 0 乘 0,但我希望这会有所帮助。祝你好运!

【讨论】:

  • "接下来您需要考虑您的圆圈之间的距离。如果您只有 100 个像素来绘制它们,那么尝试绘制 12 个变大(或变小)10 个像素的圆圈是没有用的在。同样,如果你有 500 像素的空间。所以像:“
  • 当我第一次开始这样做时,我不知道这是怎么想的,如果我在圆圈之间保持 10 像素的边界,我想要做的基本上是不可能的。这实际上帮助了我很多,谢谢!
  • 很高兴它有帮助。很难知道什么时候指出明显的(回想起来)变得傲慢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多