I'm having a hard time figuring out why when I create an Circle instance with no arguments and adding the values after with setters isn't working? When I delete the line Circle c3 = new Circle() my program works fine. I also can't call the getters to see if the setters worked.
public class MyCircle {
private double radius;
private double x;
private double y;
public MyCircle()
{
x = 0;
y = 0;
radius = 0;
}
public MyCircle(double X, double Y, double rad)
{
x = X;
y = Y;
radius = rad;
}
public void setX(double value)
{
x = value;
}
public void setY(double value)
{
y = value;
}
public void setRadius(double value)
{
radius = value;
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public double getRadius()
{
return radius;
}
public double getArea()
{
return (radius * radius) * Math.PI;
}
public boolean doesOverlap(MyCircle oC)
{
double distance = Math.sqrt((Math.pow(x - oC.x, 2) + Math.pow(y-oC.y, 2)));
if ((radius + oC.radius) > distance)
{
return true;
}
else
{
return false;
}
}
public static void main(String[] args) {
Circle c3 = new Circle();
Circle c1 = new Circle(1.0, 2.0, 3.0);
Circle c4 = new Circle(1.0, 6.0, .5);
c3.setX(1.0);
c3.setY(2.0);
c3.setRadius(5.0);
System.out.println(c3.getArea());
System.out.println(c1.getRadius());
System.out.println(c1.toString());
System.out.println(c4.toString());
if (c1.equals(c4))
{
System.out.println("c1 equals c4");
}
else
{
System.out.println("c1 does not equal c4");
}
if (c1.doesOverlap(c4))
{
System.out.println("c1 Overlaps c4");
}
else
{
System.out.println("c1 Does Not Overlap c4");
}
}
}
Your class is called MyCircle not Circle. You are trying to create Circle objects.
Replace:
Circle c3 = new Circle();
With:
MyCircle c3 = new MyCircle();
your class name is MyCircle instead of Circle
change the name of the class for Circle
Or change where you instantiate for MyCircle
Related
I have task to implement some methods to make math operations and etc. I'm fine with that part. But I cannot get how and where I have to create other part of code to make program working. Do I have to create Point objects by myself to access cordinates to make calculation?
How can I access x and y of each Point in public Triangle?
class Triangle {
public Triangle(Point a, Point b, Point c) {
//TODO
}
public double area() {
//TODO
}
public Point centroid(){
//TODO
}
}
class Point {
private double x;
private double y;
public Point(final double x, final double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
}
public class Main {
public static void main(String[] args) {
{
double area = new Triangle(new Point(0, 0), new Point(3, 0), new Point(0, 4)).area();
System.out.println(area);
}
{
Point centroid = new Triangle(new Point(0, 0), new Point(3, 0), new Point(0, 3)).centroid();
System.out.println(centroid.getX());
System.out.println(centroid.getY());
}
}
}
public static void main(String[] args) {
double w;
double h;
double d;
Scanner input = new Scanner(System.in);
System.out.print ("Enter the width of your box:");
w= input.nextDouble();
System.out.print ("Enter the height of your box:");
h= input.nextDouble();
System.out.print ("Enter the depth of your box:");
d= input.nextDouble();
Box boxOne = new Box(w, h, d);
System.out.println(boxOne.toString());
boxOne.setDim(w, h, d);
}
}
class Box
{
private double width = 1.0;
private double height = 1.0;
private double depth = 1.0;
public Box (double w, double h, double d)
{
setWidth(w);
setHeight(h);
setDepth(d);
}
public void setWidth(double w)
{
if(w > 0)
{
width = w;
}
else
{
width = 1.0;
}
}
public void setHeight(double h)
{
if(h > 0)
{
height = h;
}
else
{
height = 1.0;
}
}
public void setDepth(double d)
{
if(d > 0)
{
depth = d;
}
else
{
depth = 1.0;
}
}
public void setDim(double width, double height, double depth)
{
double volume=width*height*depth;
System.out.println("The volume of the box is "+volume);
}
public double volume ()
{
}
public String getWidth()
{
return String.format("%f",width);
}
public String getHeight()
{
return String.format("%f",height);
}
public String getDepth()
{
return String.format("%f",depth);
}
public String toString()
{
return String.format("Width is %s.\nHeight is %s.\nDepth is %s.", getWidth(), getHeight(),getDepth());
}
public boolean equalTo (Box o)
{
}
}
I'm not understanding how to use the method public boolean equalTo (Box o) and public double volume() in this code. And what should I write in the bodies of these two methods? And how to use them in the main method? I'm not understanding this two methods. how to create boolean equalTo() method and double volume() method, and how to test them?
An equalTo method would require comparing the properties of two objects:
public boolean equalTo (Box o){
boolean widthEquals = o.width == this.width;
// other checks
return widthEquals && heightEquals && depthEquals;
}
The volume method looks like simple math to me:
public double volume() {
return this.width * this.height * this.depth;
}
Testing these methods requires you to setup a test framework such as JUnit, which is covered by a lot of tutorials. Examples are:
https://www.tutorialspoint.com/junit/junit_test_framework.htm
https://junit.org/junit4/faq.html#atests_1
Testing the volume method would look something like this:
#Test
public void testVolume() {
Box box = new Box(1.0, 2.0, 3.0);
double expectedVolume = 1.0 * 2.0 * 3.0;
assertEquals(expectedVolume, box.volume());
}
Could someone explain to me why I am getting these errors on my coding when it comes to the main method project5 class. thearray[count++] keeps giving me errors, and I am not entirely sure where I made my error. I've been stuck on it for awhile now. Some guidance would be nice.
Here is my main method:
public class Project5 {
private Shape [] thearray = new Shape[100];
public static void main (String [] args) {
Project5 tpo = new Project5();
tpo.run();
}
public void run () {
int count = 0;
thearray[count++] = new Circle(20, 20, 40);
thearray[count++] = new Triangle(70, 70, 20, 30);
thearray[count++] = new Rectangle(150, 150, 40, 40);
for (int i = 0; i < count; i ++ ) {
thearray[i].display();
}
int offset = 0;
double totalarea = 0.0;
while (thearray[offset] != null) {
totalarea = totalarea + thearray[offset].area();
offset++;
}
System.out.println("The total area for " + offset + " Shape objects is " + totalarea);
}
}
Here is my Circle class:
public class Circle {
private double radius;
public Circle() {
radius = 1.0;
}
public Circle(double newRadius) {
radius = 1.0;
setRadius(newRadius);
}
public void setRadius(double newRadius) {
if(newRadius > 0) {
radius = newRadius;
}
else {
System.out.println("Error: "
+ newRadius + " is a bad radius value.");
}
}
public double getRadius() {
return radius;
}
public double getArea() {
return radius * radius * Math.PI;
}
}
and here is my Shape class:
abstract class Shape{
int x = 1;
int y = 1;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public void display() {
}
public abstract double area();
}
I would post my triangle and rectangle class, but I figured this would be enough to at least have it explained where I am messing up.
I looked at your Circle class and the constructor currently only takes one argument. However, when you create a Circle you are specifying 3 arguments.
Circle should probably extend from Shape and the first two parameters are then the x and y position of the shape, correct? If this is the case, change your class as follows:
public class Circle extends Shape {
private double radius;
public Circle(int x, int y) {
super(x, y);
radius = 1.0;
}
public Circle(int x, int y, double newRadius) {
super(x, y);
setRadius(newRadius);
}
...etc
I keep searching on how to fix this, but I cannot find something that applies/works for my problem. I am trying to print out an array of Circles. All I know is that I have to overwrite the toString() method.
I keep getting the following output:
[Heather$Circle#2a139a55, Heather$Circle#15db9742,
Heather$Circle#6d06d69c, Heather$Circle#7852e922]
import java.util.*;
public class heather {
public static void main(String[] args) {
heather c = new heather();
Circle c1 = c.new Circle(4,6,4);
Circle c2 = c.new Circle(4,5,4);
Circle c3 = c.new Circle(5,4,4);
Circle c4 = c.new Circle(5,4,3);
Circle[] a = {c1, c2, c3, c4};
Arrays.sort(a);
System.out.print(Arrays.toString(a));
}
public class Point {
private int x;
private int y;
public Point(int x, int y){
this.x = x; this.y = y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
}
public class Circle extends Point implements Comparable<Circle> {
private double radius;
private Point point;
public Circle(int x, int y, double radius) {
super(x, y); this.radius = radius;
}
public double getRadius() {
return this.radius;
}
public Point getPoint() {
return this.point;
}
public int area() {
return (int) (Math.PI*radius*radius);
}
public int compareTo(Circle other){
if(this.area()>other.area()) {
return 1;
}
if(this.area()<other.area()) {
return -1;
} else if(this.getX()>other.getX()) {
return 1;
}
if (this.getX()<other.getX()){
return -1;
} else if(this.getY()<other.getY()) {
return -1;
} else {
return 1;
}
}
}
public String toString(){
}
}
This part of your code...
}
public String toString(){
}
closes the Circle class before it includes your toString() method. Therefore, you should rewrite it like...
public String toString(){
}
}
and then just fill in whatever you want in the toString() method. Maybe something like...
return "Circle of radius " + radius;
You may find that these issues are more easily detected if your actively organize your code for readability. I've cleaned the code you posted for reference...
package Shift;
import java.util.*;
public class Shift {
public static void main(String[] args) {
Shift c = new Shift();
Circle c1 = c.new Circle(4,6,4);
Circle c2 = c.new Circle(4,5,4);
Circle c3 = c.new Circle(5,4,4);
Circle c4 = c.new Circle(5,4,3);
Circle[] a = {c1, c2, c3, c4};
Arrays.sort(a);
System.out.print(a[0]);
}
public class Point{
private int x;
private int y;
public Point(int x, int y){
this.x = x; this.y = y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
}
public class Circle extends Point implements Comparable<Circle>{
private double radius;
private Point point;
public Circle(int x, int y, double radius) {
super(x, y);
this.radius = radius;
}
public double getRadius(){
return this.radius;
}
public Point getPoint(){
return this.point;
}
public int area(){
return (int) (Math.PI*radius*radius);
}
public int compareTo(Circle other){
if(this.area()>other.area())
return 1;
if(this.area()<other.area())
return -1;
else if(this.getX()>other.getX())
return 1;
if (this.getX()<other.getX())
return -1;
else if(this.getY()<other.getY())
return -1;
else
return 1;
}
#Override
public String toString(){
return "Circle of radius " + radius;
}
}
}
I'm creating a simple Java circle calculator but am having issues getting my KeyListeners to respond quickly. The x and y values in the Circle class are not stored immediately but rather when I delete the input. For example if I input 3 for x and 5 for y the Circle class is returning values of 0 until I delete the values, then it will return the proper values. My goal is to immediately display data related to this coordinates when the user enters values. I can't do this while the KeyListeners are lagging. Thank you.
**Edit: Just realized that the values will also be correct if I hit another key afterwards (like ctrl for example)
**2nd Edit: Added Circle code at bottom
**3rd Edit: Added Point code at bottom
Here is my code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CircleGUI extends JFrame
{
Circle c;
JFrame frame;
DecimalFormat df;
private JPanel panel;
private JLabel radiusLabel, areaLabel, coordinateLabel, containsPointLabel;
private JButton calculateButton;
private JTextField radiusTextField, xTextField, yTextField;
final int WINDOW_WIDTH = 500;
final int WINDOW_HEIGHT = 300;
public static void main(String[] args)
{
Circle c = new Circle();
CircleGUI test = new CircleGUI(c);
}
public CircleGUI(Circle c)
{
this.c = c;
setTitle("Circle Calculator");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buildPanel();
add(panel);
df = new DecimalFormat("#.##");
setVisible(true);
}
private JPanel buildPanel()
{
radiusLabel = new JLabel("Enter radius:");
areaLabel = new JLabel();
radiusTextField = new JTextField(15);
calculateButton = new JButton("Calculate Area");
calculateButton.addActionListener(new CalculateAreaButtonListener());
coordinateLabel = new JLabel("Origin of the Circle:");
containsPointLabel = new JLabel("");
xTextField = new JTextField(4);
xTextField.addKeyListener(new xCoordinateTextFieldListener());
yTextField = new JTextField(4);
yTextField.addKeyListener(new yCoordinateTextFieldListener());
panel = new JPanel();
//panel.setLayout(new FlowLayout());
panel.add(radiusLabel);
panel.add(radiusTextField);
panel.add(calculateButton);
panel.add(areaLabel);
panel.add(coordinateLabel);
panel.add(xTextField);
panel.add(yTextField);
panel.add(containsPointLabel);
return panel;
}
private class CalculateAreaButtonListener implements ActionListener
{
#Override
public void actionPerformed(ActionEvent e)
{
areaLabel.setText(String.valueOf(df.format(calculateArea())));
}
public double calculateArea()
{
double radius = Double.parseDouble(radiusTextField.getText());
c.setRadius(radius);
return c.getArea();
}
}
private class xCoordinateTextFieldListener implements KeyListener
{
#Override
public void keyPressed(KeyEvent e)
{
double x;
if (!xTextField.getText().equals(null) && !xTextField.getText().equals(""))
{
x = Double.parseDouble(xTextField.getText());
c.setX(x);
}
}
#Override
public void keyReleased(KeyEvent e)
{
System.out.println("x: " + c.getX());
}
#Override
public void keyTyped(KeyEvent arg0)
{
}
}
private class yCoordinateTextFieldListener implements KeyListener
{
#Override
public void keyPressed(KeyEvent e)
{
double y;
if (!yTextField.getText().equals(null) && !yTextField.getText().equals(""))
{
y = Double.parseDouble(yTextField.getText());
c.setY(y);
}
;
}
#Override
public void keyReleased(KeyEvent e)
{
System.out.println("y: " + c.getY());
}
#Override
public void keyTyped(KeyEvent arg0)
{
}
}
}
Circle code:
public class Circle
{
//Instantiate and declare instance fields
Point origin = new Point();
double radius;
Circle(double radius)
{
this.radius = radius;
origin.setX(0);
origin.setY(0);
}
//Two arg-constructor
Circle(Point origin, double radius)
{
this.origin = origin;
this.radius = radius;
}
//Three-arg constructor
Circle(double xValue, double yValue, double radius)
{
origin.setX(xValue);
origin.setY(yValue);
this.radius = radius;
}
//Default constructor
Circle()
{
setX(0);
setY(0);
radius = 0;
}
//Copy constructor
Circle(Circle c)
{
setX(c.getX());
setY(c.getY());
radius = c.getRadius();
}
//Get origin of the circle
Point getOrigin()
{
return origin;
}
//Set origin of the circle
void setOrigin(Point point)
{
this.origin = point;
}
//Set x value
void setX(double x)
{
origin.setX(x);
}
//Get x value
double getX()
{
return origin.getX();
}
//Set y value
void setY(double y)
{
this.origin.setY(y);
}
//Get y value
double getY()
{
return origin.getY();
}
//Set radius field
void setRadius(double radius)
{
this.radius = radius;
}
//Get radius field
double getRadius()
{
return radius;
}
//Get area of the circle
double getArea()
{
//Use constant provided in the static method Math.PI
return Math.PI * (radius * radius);
}
//Translate instance fields to a human readable String
public String toString()
{
return "x: " + this.getX() + ", y: " + this.getY() + ", radius: " + this.radius;
}
//Compare whether two circles instance fields are equal
boolean equals(Circle c)
{
if (getX() == c.getX() && getY() == c.getY() && getRadius() == c.getRadius())
return true;
else
return false;
}
double getDistance(double xValue, double yValue)
{
double x = xValue - this.getX();
double y = yValue - this.getY();
return Math.sqrt((x * x) + (y * y));
}
double getDistance(Circle c)
{
//Initialize variables to x^2-x^1 and y^2-y^1
double x = c.getX() - this.getX();
double y = c.getY() - this.getY();
//Calculate distance to center of the circle
return Math.sqrt((x * x) + (y * y));
}
boolean containsPoint(double xValue, double yValue)
{
if (getDistance(xValue, yValue) <= radius)
return true;
else
return false;
}
//Test if two circle overlap
boolean doesOverlap(Circle c)
{
//Initialize sumOfRadii to the sum of both circles radius
double sumOfRadii = c.getRadius() + radius;
//If the distance to the center of the circle is less than or equal to the sum of the two circles radius then return true, otherwise return false.
if (getDistance(c) <= sumOfRadii)
return true;
else
return false;
}
}
Point Code:
public class Point
{
private double x;
private double y;
public Point(double xValue, double yValue)
{
x = xValue;
y = yValue;
}
public Point(Point p) {
this(p.x, p.y);
}
public Point() {
this(0, 0);
}
public void setX(double xValue)
{
this.x = xValue;
}
public double getX()
{
return x;
}
public void setY(double yValue)
{
this.y = yValue;
}
public double getY()
{
return y;
}
public boolean equals(Point otherPoint)
{
return (this.x == otherPoint.x) && (this.y == otherPoint.y);
}
public String toString() {
return "(" + x + ", " + y + ")";
}
}
Keylistener is not the right choice for responding to changes in a text field. See How to Write a Document Listener for an alternate approach.
Firstly, I wouldn't use a KeyListener to monitor changes to a text field, a DocumentListener would provide more useful information to the changes of the underlying field, but an ActionListener would probably be more appropriate under these conditions.
Take a look at How to write an Action Listener and How to use text fields for more details