我会坦率地说这件事;这是一项家庭作业,但是有人可以指导我正确的方向并向我解释代码的某些部分应该如何工作吗?指示在代码和问题下方。
到目前为止,这是我的代码:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Rainbow extends JPanel
{
// Declare skyColor:
private final Color skyColor = Color.CYAN;
public Rainbow()
{
setBackground(skyColor);
}
// Draws the rainbow.
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
// Declare and initialize local int variables xCenter, yCenter
// that represent the center of the rainbow rings:
int xCenter = width/2;
int yCenter = (height * 3) /4;
// Declare and initialize the radius of the large semicircle:
int largeRadius = width/4;
g.setColor(Color.RED);
// Draw the large semicircle:
g.fillArc(xCenter,yCenter,largeRadius,height,0,180);
// Declare and initialize the radii of the small and medium
// semicircles and draw them:
int smallRadius = height/4;
g.setColor(Color.MAGENTA);
g.fillArc(xCenter,yCenter,width,height,0,180);
int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius);
g.setColor(Color.GREEN);
g.fillArc(xCenter,yCenter,width,height,0,180);
// Calculate the radius of the innermost (sky-color) semicircle
// so that the width of the middle (green) ring is the
// arithmetic mean of the widths of the red and magenta rings:
// Draw the sky-color semicircle:
g.fillArc(xCenter,yCenter,width,height,0,180);
}
public static void main(String[] args)
{
JFrame w = new JFrame("Rainbow");
w.setBounds(300, 300, 300, 200);
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = w.getContentPane();
c.add(new Rainbow());
w.setVisible(true);
}
}
我的问题:fillArc 究竟是如何工作的;我了解参数中的内容,但是必须做什么才能使每条弧线彼此不同?如何为每条弧线设置一种颜色?我尝试这样做,最后我列出了最接近结尾的颜色并覆盖了其他颜色。当我继续编码时,我可能会有更多。
这些是方向:
![在此处输入图像描述][1]
“彩虹”由四个重叠的半圆组成。外圈为红色(Color.RED),中间为绿色(Color.GREEN),内圈为洋红色(Color.MAGENTA)。最里面的半圆与背景颜色相同。
按照下面的说明填写 Rainbow.java 中的空白。
启动彩虹项目。
在文件顶部的类声明之前添加一个带有您的姓名的完整注释标题。
向 Rainbow 类添加 Color 类型的私有最终字段 skyColor 的声明,初始化为 Color.CYAN(天空的颜色)。在 Rainbow 的构造函数中,将窗口的背景设置为 skyColor 而不是 Color.WHITE。
在paint 方法中,声明表示环中心坐标的局部整数变量xCenter 和yCenter。分别将它们初始化为内容窗格的 1/2 宽度和 3/4 高度(向下)。(回想一下,Java 中图形坐标的原点位于内容窗格的左上角,y 轴指向下方。)不要插入来自窗口尺寸的固定数字。
声明一个表示最大(红色)半圆半径的局部变量 largeRadius,并将其初始化为宽度的 1/4。
一个方法调用 g.fillArc(x, y, size, size, from, degree) (带有所有整数参数)绘制一个圆的扇区。x 和 y 是矩形(在本例中为正方形)左上角的坐标,椭圆(逻辑上)内接在该矩形中;size 是正方形的边(和圆的直径);from 是弧的起点,以度为单位(水平直径的最东端为 0),度(正数)是弧的度量,逆时针方向。在paint方法中添加一个语句来绘制最大(红色)的半圆。测试你的程序。
添加语句以显示中等(绿色)和小(洋红色)半圆。洋红色半圆的半径应为高度的 1/4。绿色的半径应该是红色半圆半径和洋红色半圆半径的几何平均值(乘积的平方根),四舍五入到最接近的整数。(对 Math.sqrt(x) 的调用返回 x 的平方根的值,一个双精度值。)重新测试你的程序。
添加语句以显示背景(“天空”)颜色的最内半圆以完成彩虹。对这个半圆的颜色使用 skyColor 常量。选择天空颜色半圆的半径,使中间(绿色)环的宽度是红色和品红色环宽度的算术平均值。
测试你的程序。
提交您完成的程序并运行输出。您的运行输出(彩虹图片)可以通过捕获屏幕输出(Alt-PrintScrn),将其粘贴到图形程序(例如 MS Paint)中,然后将图像保存到您的 Eclipse 项目目录中来包含。
import java.awt.Color; import java.awt.Graphics; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JPanel; public class Rainbow extends JPanel { //Declare skyColor: private final Color skyColor = Color.CYAN; public Rainbow() { setBackground(skyColor); } // Draws the rainbow. public void paintComponent(Graphics g) { super.paintComponent(g); int width = getWidth(); int height = getHeight(); // Declare and initialize local int variables xCenter, yCenter // that represent the center of the rainbow rings: int xCenter = width/2; int yCenter = (height * 3) /4; // Declare and initialize the radius of the large semicircle: int largeRadius = width/4; g.setColor(Color.RED); // Draw the large semicircle: g.fillArc(xCenter - largeRadius,yCenter - largeRadius ,largeRadius,largeRadius,0,180); // Declare and initialize the radii of the small and medium //semicircles and draw them: int smallRadius = height/4; int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius); g.setColor(Color.GREEN); g.fillArc(xCenter-(largeRadius+mediumRadius)/2,yCenter- (largeRadius+mediumRadius)/2,mediumRadius,mediumRadius,0,180); g.setColor(Color.MAGENTA); g.fillArc(xCenter-(largeRadius+smallRadius)/2,yCenter-(largeRadius+smallRadius)/2,smallRadius,smallRadius,0,180); // Calculate the radius of the innermost (sky-color) semicircle // so that the width of the middle (green) ring is the // arithmetic mean of the widths of the red and magenta rings: int skyRadius = (int)((2 * Math.sqrt(smallRadius * largeRadius)) - width/4); // Draw the sky-color semicircle: g.setColor(skyColor); g.fillArc(xCenter-skyRadius,yCenter-skyRadius,skyRadius,skyRadius,0,180); } public static void main(String[] args) { JFrame w = new JFrame("Rainbow"); w.setBounds(300, 300, 300, 200); w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = w.getContentPane(); c.add(new Rainbow()); w.setVisible(true); } }