Java project question: You are given two separate JPanels, DrawArcs.java(Fan) an
ID: 3828003 • Letter: J
Question
Java project question:
You are given two separate JPanels, DrawArcs.java(Fan) and StillClock.java(clock)
Use your own thread to give them a life, that means make the clock to work in realtime, and Fan
To start. Use your own GUI to start and stop as you wish.
DrawArcs.java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
public class DrawArcs extends JFrame {
public DrawArcs() {
setTitle("DrawArcs");
add(new ArcsPanel());
}
/** Main method */
public static void main(String[] args) {
DrawArcs frame = new DrawArcs();
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 300);
frame.setVisible(true);
}
}
// The class for drawing arcs on a panel
class ArcsPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;
int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4);
int x = xCenter - radius;
int y = yCenter - radius;
g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30);
g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30);
g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30);
g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30);
}
}
StillClock.java:
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class StillClock extends JPanel {
private int hour;
private int minute;
private int second;
/** Construct a default clock with the current time*/
public StillClock() {
setCurrentTime();
}
/** Construct a clock with specified hour, minute, and second */
public StillClock(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
/** Return hour */
public int getHour() {
return hour;
}
/** Set a new hour */
public void setHour(int hour) {
this.hour = hour;
repaint();
}
/** Return minute */
public int getMinute() {
return minute;
}
/** Set a new minute */
public void setMinute(int minute) {
this.minute = minute;
repaint();
}
/** Return second */
public int getSecond() {
return second;
}
/** Set a new second */
public void setSecond(int second) {
this.second = second;
repaint();
}
@Override /** Draw the clock */
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Initialize clock parameters
int clockRadius =
(int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;
// Draw circle
g.setColor(Color.black);
g.drawOval(xCenter - clockRadius, yCenter - clockRadius,
2 * clockRadius, 2 * clockRadius);
g.drawString("12", xCenter - 5, yCenter - clockRadius + 12);
g.drawString("9", xCenter - clockRadius + 3, yCenter + 5);
g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);
// Draw second hand
int sLength = (int)(clockRadius * 0.8);
int xSecond = (int)(xCenter + sLength *
Math.sin(second * (2 * Math.PI / 60)));
int ySecond = (int)(yCenter - sLength *
Math.cos(second * (2 * Math.PI / 60)));
g.setColor(Color.red);
g.drawLine(xCenter, yCenter, xSecond, ySecond);
// Draw minute hand
int mLength = (int)(clockRadius * 0.65);
int xMinute = (int)(xCenter + mLength *
Math.sin(minute * (2 * Math.PI / 60)));
int yMinute = (int)(yCenter - mLength *
Math.cos(minute * (2 * Math.PI / 60)));
g.setColor(Color.blue);
g.drawLine(xCenter, yCenter, xMinute, yMinute);
// Draw hour hand
int hLength = (int)(clockRadius * 0.5);
int xHour = (int)(xCenter + hLength *
Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
int yHour = (int)(yCenter - hLength *
Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
g.setColor(Color.green);
g.drawLine(xCenter, yCenter, xHour, yHour);
}
public void setCurrentTime() {
// Construct a calendar for the current date and time
Calendar calendar = new GregorianCalendar();
// Set current hour, minute and second
this.hour = calendar.get(Calendar.HOUR_OF_DAY);
this.minute = calendar.get(Calendar.MINUTE);
this.second = calendar.get(Calendar.SECOND);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
Explanation / Answer
// Program to drowarcs.java(FAN) import java.awt.event.*; import javax.swing.*; import java.awt.*; public class ClockAnimation extends JFrame { //create an instance for StillClock private StillClock clock = new StillClock(); //create buttons JButton startButton; JButton stopButton; //create a timer (1000 milliseconds delay) Timer timer = new Timer(1000, new TimerListener()); public ClockAnimation() { //create a panel to hold the clock JPanel clockPanel = new JPanel(); //add the clock to panel clockPanel.add(clock); //create a panel to hold start and stop buttons JPanel ButtonPanel = new JPanel(); //create a start button startButton = new JButton("Start"); //add action listener to startButton startButton.addActionListener(new startListener()); //create a stop button stopButton = new JButton("Stop"); //add action listener to stopButton stopButton.addActionListener(new stopListener()); //add start button to ButtonPanel ButtonPanel.add(startButton); //add stop button to ButtonPanel ButtonPanel.add(stopButton); //create elapsedPanel to hold elaped time JPanel ElspsedPanel = new JPanel(); //add start time to panel add.(timer.start()); //add stop time to panel add.(timer.stop()); //add the elapsed time to panel ElapsedPanel.add((timer.start())-(timer.stop())); //add the clockPanel and ButtonPanel to the frame add(clockPanel, BorderLayout.NORTH); add(ButtonPanel, BorderLayout.CENTER); add(ElapsedPanel, BorderLayout.SOUTH); } private class startListener implements ActionListener { public void actionPerformed(ActionEvent e) { //start clock time timer.start(); } } private class stopListener implements ActionListener { public void actionPerformed(ActionEvent e) { //stop clock time timer.stop(); } } private class TimerListener implements ActionListener { public void actionPerformed(ActionEvent e) { //set current time and paint clock to display current time clock.setCurrentTime(); clock.repaint(); } } //main method public static void main(String[] args) { //create a JFrame instance JFrame frame = new ClockAnimation(); //set title of the frame frame.setTitle("My Clock"); //set location of the frame to center frame.setLocationRelativeTo(null); //set frame to close on exit frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set frame to visable frame.setVisible(true); //set components to fit in frame frame.pack(); } } // Program to stillclass.java import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.util.*; public class StillClock extends JPanel { //create variables for StillClock public int hour; private int minute; private int second; //create a clock with current time public StillClock() { setCurrentTime(); } //create a clock with specified time public StillClock(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } //return hour public int getHour() { return hour; } //set new hour public void setHour(int hour) { this.hour = hour; repaint(); } //return minutes public int getMinute() { return minute; } //set new minute public void setMinute(int minute) { this.minute = minute; repaint(); } //return seconds public int getSecond() { return second; } //set new second public void setSecond(int second) { this.second = second; repaint(); } //draw the clock protected void paintComponent(Graphics g) { super.paintComponent(g); int clockRadius = (int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5); int xCenter = getWidth()/ 2; int yCenter = getHeight() / 2; //draw clock circle g.setColor(Color.BLACK); g.drawOval(xCenter - clockRadius, yCenter - clockRadius, 2 * clockRadius, 2 * clockRadius); g.drawString("12", xCenter - 5, yCenter - clockRadius + 13); g.drawString("9", xCenter - clockRadius + 3, yCenter + 5); g.drawString("3", xCenter + clockRadius - 10, yCenter + 3); g.drawString("6", xCenter - 3, yCenter + clockRadius - 3); //draw seconds hand int sLength = (int)(clockRadius * 0.8); int xSecond = (int)(xCenter + sLength * Math.sin(second * (2 * Math.PI/ 60))); int ySecond = (int)(yCenter - sLength * Math.cos(second * (2 * Math.PI/ 60))); g.drawLine(xCenter, yCenter, xSecond, ySecond); g.setColor(Color.red); //draw minutes hand int mLength = (int)(clockRadius * 0.65); int xMinute = (int)(xCenter + mLength * Math.sin(minute * (2 * Math.PI/ 60))); int yMinute = (int)(yCenter - mLength * Math.cos(minute * (2 * Math.PI/ 60))); g.drawLine(xCenter, yCenter, xMinute, yMinute); g.setColor(Color.lightGray); //draw hours hand int hLength = (int)(clockRadius * 0.8); int xHour = (int)(xCenter + hLength * Math.sin(hour * (2 * Math.PI/ 60))); int yHour = (int)(yCenter - hLength * Math.cos(hour * (2 * Math.PI/ 60))); g.drawLine(xCenter, yCenter, xHour, yHour); g.setColor(Color.darkGray); } //set current time to StillClock variables public void setCurrentTime() { //construct calendar for current time and date Calendar calendar = new GregorianCalendar(); //set current time this.hour = calendar.get(Calendar.HOUR_OF_DAY); this.minute = calendar.get(Calendar.MINUTE); this.second = calendar.get(Calendar.SECOND); } //get dimensions of JPanel public Dimension getPreferredSize() { return new Dimension(200, 200); } }
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.