JAVA - 创建可扩展到窗口大小的基本2D形状

时间:2016-10-16 20:03:07

标签: java jframe window jpanel scale

我正在尝试通过阅读和从我在网上找到的教科书中做例子来学习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);

    }

}

1 个答案:

答案 0 :(得分:0)

如果你想要你的圆圈是圆形的(而不是椭圆形),那么首先你需要知道哪个更窄,宽度或高度。使用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

我希望如此清楚。基本上,每次迭代时,边界矩形(或方形)变小def output = "" def objectFromDb = fetchObjectFromDb() def output += objectFromDb.getContent() // use toString() if needed out << output

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