mirror of
https://github.com/robertvokac/time-calc.git
synced 2025-03-28 00:25:22 +01:00
218 lines
7.7 KiB
Java
218 lines
7.7 KiB
Java
package rvc.timecalc;
|
|
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.Timer;
|
|
import java.awt.BasicStroke;
|
|
import java.awt.Color;
|
|
import java.awt.Dimension;
|
|
import java.awt.Font;
|
|
import java.awt.Graphics;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.RenderingHints;
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.event.MouseListener;
|
|
import java.sql.Time;
|
|
import java.text.DateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.GregorianCalendar;
|
|
import java.util.Locale;
|
|
|
|
//https://kodejava.org/how-do-i-write-a-simple-analog-clock-using-java-2d/
|
|
public class AnalogClock extends JPanel {
|
|
|
|
private static final Color FOREGROUND_COLOR = new Color(220, 220, 220);
|
|
private static final Color BACKGROUND_COLOR = new Color(238, 238, 238);
|
|
|
|
private boolean coloured = false;
|
|
private boolean mouseOver = false;
|
|
private int side;
|
|
private Color[] colors = Utils.getRandomColors();
|
|
|
|
public AnalogClock() {
|
|
setPreferredSize(new Dimension(400, 300));
|
|
setBackground(BACKGROUND_COLOR);
|
|
new Timer(20, e -> repaint()).start();
|
|
|
|
addMouseListener(new MouseListener() {
|
|
@Override
|
|
public void mouseClicked(MouseEvent e) {
|
|
Utils.highlighted.flip();
|
|
}
|
|
|
|
@Override
|
|
public void mousePressed(MouseEvent e) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void mouseReleased(MouseEvent e) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void mouseEntered(MouseEvent e) {
|
|
coloured = true;
|
|
mouseOver = true;
|
|
}
|
|
|
|
@Override
|
|
public void mouseExited(MouseEvent e) {
|
|
coloured = false;
|
|
mouseOver = false;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
JFrame frame = new JFrame("Analog Clock");
|
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
frame.add(new AnalogClock());
|
|
frame.pack();
|
|
frame.setVisible(true);
|
|
}
|
|
|
|
private static Color modifyColourALittleBit(Color colorIn) {
|
|
int r = colorIn.getRed();
|
|
int g = colorIn.getGreen();
|
|
int b = colorIn.getBlue();
|
|
Color color = new Color(
|
|
modifyByteALittleBit(r),
|
|
modifyByteALittleBit(g),
|
|
modifyByteALittleBit(b)
|
|
);
|
|
return color;
|
|
}
|
|
|
|
private static int modifyByteALittleBit(int n) {
|
|
// if(Math.random() <= 0.75) {
|
|
// return n;
|
|
// }
|
|
boolean negative = Math.random() > 0.5;
|
|
int result = n + ((negative ? (-1) : 1)) * ((int) (Math.random() * (
|
|
Math.random() * 20)));
|
|
if (result > 255) {
|
|
return 255;
|
|
}
|
|
if (result < 0) {
|
|
return 0;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
public void paintComponent(Graphics g) {
|
|
super.paintComponent(g);
|
|
Graphics2D g2d = (Graphics2D) g;
|
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
|
RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
|
this.side = Math.min(getWidth(), getHeight());
|
|
int centerX = getWidth() / 2;
|
|
int centerY = getHeight() / 2;
|
|
|
|
GregorianCalendar time = new GregorianCalendar();
|
|
int second = time.get(Calendar.SECOND);
|
|
int minute = time.get(Calendar.MINUTE);
|
|
int hour = time.get(Calendar.HOUR_OF_DAY);
|
|
|
|
// Draw clock numbers and circle
|
|
drawClockFace(g2d, centerX, centerY, side / 2 - 40);
|
|
|
|
drawHand(g2d, side / 2 - 10, second / 60.0, 0.5f, Color.RED);
|
|
if(TimeCalcConf.getInstance().areClockHandsLong()) drawHand(g2d, (side / 2 - 10) / 4,
|
|
(second > 30 ? second - 30 : second + 30) / 60.0, 0.5f,
|
|
Color.RED);
|
|
//
|
|
double minutes = minute / 60.0 + second / 60.0 / 60.0;
|
|
drawHand(g2d, side / 2 - 20, minutes, 2.0f,
|
|
Color.BLUE);
|
|
if(TimeCalcConf.getInstance().areClockHandsLong()) drawHand(g2d, (side / 2 - 20) / 4,
|
|
minutes + minutes > 0.5 ? minutes - 0.5 :
|
|
minutes + (minutes > 0.5 ? (-1) : 1) * 0.5, 2.0f,
|
|
Color.BLUE);
|
|
//
|
|
double hours = hour / 12.0 + minute / 60.0 / 12 + second / 60 / 60 / 12;
|
|
drawHand(g2d, side / 2 - 40,
|
|
hours, 4.0f,
|
|
Color.BLACK);
|
|
if(TimeCalcConf.getInstance().areClockHandsLong()) drawHand(g2d, (side / 2 - 40) / 4, hours + hours > 0.5 ? hours - 0.5 :
|
|
hours + (hours > 0.5 ? (-1) : 1) * 0.5, 4.0f,
|
|
Color.BLACK);
|
|
|
|
}
|
|
|
|
private void drawHand(Graphics2D g2d, int length, double value,
|
|
float stroke, Color color) {
|
|
length = length - 4;
|
|
double angle = Math.PI * 2 * (value - 0.25);
|
|
int endX = (int) (getWidth() / 2 + length * Math.cos(angle));
|
|
int endY = (int) (getHeight() / 2 + length * Math.sin(angle));
|
|
|
|
g2d.setColor((Utils.highlighted.get() || mouseOver) ? color :
|
|
FOREGROUND_COLOR);
|
|
g2d.setStroke(new BasicStroke(stroke));
|
|
g2d.drawLine(getWidth() / 2, getHeight() / 2, endX, endY);
|
|
}
|
|
|
|
private void drawClockFace(Graphics2D g2d, int centerX, int centerY,
|
|
int radius) {
|
|
g2d.setStroke(new BasicStroke(2.0f));
|
|
g2d.setColor(Utils.highlighted.get() || mouseOver ? Color.BLACK :
|
|
FOREGROUND_COLOR);
|
|
// System.out.println("centerX=" + centerX);
|
|
// System.out.println("centerY=" + centerY);
|
|
// System.out.println("radius=" + radius);
|
|
g2d.drawOval(1, 1, centerX * 2 - 4, centerY * 2 - 4);
|
|
g2d.drawOval(2, 2, centerX * 2 - 4, centerY * 2 - 4);
|
|
// g2d.drawOval(3, 3, centerX * 2 - 6, centerY * 2 - 6);
|
|
// g2d.drawOval(4, 4, centerX * 2 - 8, centerY * 2 - 8);
|
|
|
|
if(Utils.highlighted.get() && TimeCalcConf.getInstance().isClockColorful() && Math.random()>0.9) {colors = Utils.getRandomColors();}
|
|
if (Utils.highlighted.get() && coloured) {
|
|
for (int i = 0; i < 12; i++) {
|
|
//if(Math.random() > 0.75) {
|
|
colors[i] = modifyColourALittleBit(colors[i]);
|
|
//}
|
|
}
|
|
}
|
|
// if(Math.random() > (1 - (1/200))) {
|
|
// for(int i = 0; i<12; i++) {
|
|
// colors[i] = i == 11 ? colors[0] :colors[i + 1];
|
|
// }
|
|
// }
|
|
DateFormat formatter2 =
|
|
new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH);
|
|
String now = formatter2.format(new Date());
|
|
|
|
if (coloured) {
|
|
g2d.setColor(Utils.highlighted.get() || mouseOver ? Color.BLACK :
|
|
FOREGROUND_COLOR);
|
|
g2d.setFont(new Font("sans", Font.PLAIN, 12));
|
|
DateFormat formatter =
|
|
new SimpleDateFormat("EEEE : yyyy-MM-dd", Locale.ENGLISH);
|
|
g2d.drawString(formatter.format(new Date()), ((int) (side * 0.25)),
|
|
((int) (side * 0.35)));
|
|
//
|
|
g2d.drawString(now, ((int) (side * 0.25) + 30),
|
|
((int) (side * 0.35)) + 60);
|
|
}
|
|
for (int i = 1; i <= 12; i++) {
|
|
double angle = Math.PI * 2 * (i / 12.0 - 0.25);
|
|
int dx = centerX + (int) ((radius + 20) * Math.cos(angle)) - 4;
|
|
int dy = centerY + (int) ((radius + 20) * Math.sin(angle)) + 4;
|
|
|
|
int seconds = Integer.valueOf(now.split(":")[2]);
|
|
|
|
if (Utils.highlighted.get() && coloured && TimeCalcConf.getInstance()
|
|
.isClockColorful()) {g2d.setColor(colors[i - 1]);}
|
|
g2d.setFont(new Font("sans", Font.BOLD, 16));
|
|
g2d.drawString(Integer.toString(i), dx, dy);
|
|
}
|
|
|
|
}
|
|
|
|
} |