I'm trying to make a gui application which displays a rainbow when run by the user. For whatever reason the semicircles won't show up in the window. I made a debug method and it shows the x and y to both be 0. Could someone tell me what's wrong?
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:
static 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 = (1/2)*width;
int yCenter = (3/4)*height;
// Declare and initialize the radius of the large semicircle:
int smallRadius = height/4;
int largeRadius = width/4;
int mediumRadius = (int) Math.sqrt(smallRadius * largeRadius);
g.setColor(Color.RED);
g.fillArc(xCenter - largeRadius/2,yCenter - largeRadius/2 + largeRadius/4 -height/4,largeRadius,largeRadius,0,180);
// Draw the large semicircle:
// Declare and initialize the radii of the small and medium
// semicircles and draw them:
g.setColor(Color.GREEN);
g.fillArc(largeRadius+mediumRadius/2, yCenter-(largeRadius+mediumRadius)/2, mediumRadius, mediumRadius, 0, 180);
g.setColor(Color.MAGENTA);
g.fillArc(largeRadius+smallRadius/2, yCenter-(largeRadius+smallRadius)/2, smallRadius, smallRadius, 0, 180); // Calculate the radius of the innermost (sky-color) semicircle
debug(xCenter,yCenter,smallRadius,largeRadius,mediumRadius);
// Draw the sky-color semicircle:
// ________________________________________________
}
public static void debug(int x,int y,int r1,int r2,int r3)
{
System.out.println("xCenter is " + x + ".");
System.out.println("yCenter is " + y + ".");
System.out.println("smallRadius is " + r1 + ".");
System.out.println("largeRadius is " + r2 + ".");
System.out.println("mediumRadius is " + r3 + ".");
}
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);
}
}
The problem is here:
int xCenter = (1/2)*width; // this division truncates decimals, returns 0
int yCenter = (3/4)*height;
Try this:
int xCenter = (int)((1.0/2)*width); // this division preserves decimals
int yCenter = (int)((3.0/4)*height);
Or even simpler:
int xCenter = (int)(0.5*width);
int yCenter = (int)(0.75*height);
You were performing an integer division, this expression: 1/2
returns 0
, and any number multiplied times 0
is 0
.
You're doing int division. 1/2 and 3/4 are both 0. Instead do double division, and cast to int, or better for your example, multiply numerators first before dividing.
eg, instead of:
int xCenter = (1/2)*width;
int yCenter = (3/4)*height;
do:
// No need to cast!
int xCenter = width / 2;
int yCenter = (3 * height) / 4;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.