`

Java GUI绘制时钟

    博客分类:
  • Java
阅读更多

Java GUI组件练习用Demo,主要是为了学习GUI的设计思路、组件的特性。这里的代码并不是最优雅的解决方案,千万别纠结这个……

 

要点:

  1. 绘图的框架应该继承自JFrame,具体组件继承自JPanel。
  2. 继承自JPanel的类覆写父类(JComponent)的paintComponent()方法,注意不是Container的paintComponents()!
  3. 这些都是不能重用的组件,所以要刷新则调用repaint(),此处在每次调用setter方法的时候进行调用。
  4. 通过时分秒计算时针、分针、秒针的位置需要用三角函数的知识。 
  5. 在计算时针和分针角度时,秒数对其影响太小(为second/3600),故此处为方便忽略不算。

 

效果图:黄线只是为了调整时钟数字摆放的位置,展示的代码中已经删去。

 

用于显示GUI的类,继承了JFrame,引用了两个继承自JPanel的类(分别用作绘画时钟和显示具体时间)。

package thinkwise.gui.graphics.practice;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.Timer;

public class DisplayClock extends JFrame {
	private StillClock clock = new StillClock();

	public DisplayClock() {
		
		final MessagePanel p = new MessagePanel(clock.getHour() + ":" + clock.getMinute() + ":" + clock.getSecond());
		p.setCentered(true);
		p.setFont(new Font("Courier", Font.BOLD, 16));
		p.setForeground(Color.blue);
		
		add(clock);
		add(p, BorderLayout.SOUTH);
		
		Timer timer = new Timer(1000, new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				clock.setCurrentTime();
				clock.repaint();
				p.setMessage(clock.getHour() + ":" + clock.getMinute() + ":" + clock.getSecond());
				p.repaint();
			}
		});
		timer.start();
		
	}
	
	public static void main(String[] args) {
		DisplayClock c = new DisplayClock();
		c.setTitle("Clock");
		c.setSize(300, 350);
		c.setVisible(true);
		c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		c.setLocationRelativeTo(null);
	}
}

 

 时钟类

package thinkwise.gui.graphics.practice;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

public class StillClock extends JPanel {
	
	private int hour;
	private int minute;
	private int second;
	
	public StillClock() {
		setCurrentTime();
	}
	
	public StillClock(int hour, int minute, int second){
		this.hour = hour;
		this.minute = minute;
		this.second = second;
	}

	@Override
	public Dimension getPreferredSize() {
		return new Dimension(200, 200);
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		int xCenter = getWidth()/2;
		int yCenter = getHeight()/2;
		int clockRadius = (int) (Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
		
		g.setColor(Color.black);
		g.drawOval(xCenter - clockRadius, yCenter - clockRadius, 2 * clockRadius, 2 * clockRadius);
		g.drawString("12", xCenter - 5, yCenter - clockRadius + 12);
		g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
		g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);
		g.drawString("9", xCenter - clockRadius + 3, yCenter + 3);
		
		int sLength = (int) (clockRadius * 0.8);
		int xSecnd = (int) (xCenter + sLength * Math.sin(2 * Math.PI/60 * second));
		int ySecond = (int) (yCenter - sLength * Math.cos(2 * Math.PI/60 * second));
		g.setColor(Color.RED);
		g.drawLine(xCenter, yCenter, xSecnd, ySecond);
		
		int mLength = (int) (clockRadius * 0.65);
		int xMinute = (int) (xCenter + mLength * Math.sin((minute + second/60) * 2 * Math.PI/60));
		int yMinute = (int) (yCenter - mLength * Math.cos((minute + second/60) * (2 * Math.PI/60)));
		g.setColor(Color.blue);
		g.drawLine(xCenter, yCenter, xMinute, yMinute);
		
		int hLength = (int) (clockRadius * 0.5);
		int xHour = (int) (xCenter + hLength * Math.sin((hour % 12 + minute/60) * (2 * Math.PI/12)));
		int yHour = (int) (yCenter - hLength * Math.cos((hour % 12 + minute/60) * (2 * Math.PI/12)));
		g.setColor(Color.green);
		g.drawLine(xCenter, yCenter, xHour, yHour);
	}
	
	public void setCurrentTime(){
		Calendar calendar = new GregorianCalendar();
		this.hour = calendar.get(Calendar.HOUR_OF_DAY);
		this.minute = calendar.get(Calendar.MINUTE);
		this.second = calendar.get(Calendar.SECOND);
	}

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		this.hour = hour;
		repaint();
	}

	public int getMinute() {
		return minute;
	}

	public void setMinute(int minute) {
		this.minute = minute;
		repaint();
	}

	public int getSecond() {
		return second;
	}

	public void setSecond(int second) {
		this.second = second;
		repaint();
	}
	
}

 

时间文本显示:

package thinkwise.gui.graphics.practice;

import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

public class MessagePanel extends JPanel {

	private String message = "Welcome to Java";
	private int xCoordinate = 20;
	private int yCoordinate = 20;
	private boolean centered;
	private int interval = 10;
	
	public MessagePanel() {
	}
	
	public MessagePanel(String message){
		this.message = message;
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		if(centered){
			FontMetrics fm = g.getFontMetrics();
			int stringWidth = fm.stringWidth(message);
			int stringAscent = fm.getAscent();
			
			xCoordinate = getWidth()/2 - stringWidth/2;
			yCoordinate = getHeight()/2 + stringAscent/2;
		}
		g.drawString(message, xCoordinate, yCoordinate);
	}
	
	@Override
	public Dimension getPreferredSize() {
		return new Dimension(200, 30);
	}
	
	public void moveLeft(){
		xCoordinate -= interval;
		repaint();
	}
	
	public void moveRight(){
		xCoordinate += interval;
		repaint();
	}
	
	public void moveUp(){
		yCoordinate += interval;
		repaint();
	}
	
	public void moveDown(){
		yCoordinate -= interval;
		repaint();
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
		repaint();
	}

	public int getxCoordinate() {
		return xCoordinate;
	}

	public void setxCoordinate(int xCoordinate) {
		this.xCoordinate = xCoordinate;
		repaint();
	}

	public int getyCoordinate() {
		return yCoordinate;
	}

	public void setyCoordinate(int yCoordinate) {
		this.yCoordinate = yCoordinate;
		repaint();
	}

	public boolean isCentered() {
		return centered;
	}

	public void setCentered(boolean centered) {
		this.centered = centered;
		repaint();
	}

	public int getInterval() {
		return interval;
	}

	public void setInterval(int interval) {
		this.interval = interval;
		repaint();
	}
}

 

 参考资料:
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    用JAVA绘制一个时钟(时分秒)

    在 DrawClock 类中,我们使用了 Java 语言中的图形绘制类 Graphics 来绘制时钟。我们首先定义了时针、分针和秒针的终点坐标,然后使用 Graphics 类的 drawLine 方法绘制时针、分针和秒针。 四、 数学公式 在绘制...

    利用JAVA applet绘制的时钟

    - `paint()`方法会使用`Graphics`对象来绘制时钟的背景、数字、分针、时针和秒针。`Graphics`类提供了各种绘图操作,如填充、描边、绘制线条和形状。 4. **Java GUI和AWT库**: - Java Applet的图形绘制是通过...

    Java绘制的时钟小程序

    总的来说,这个"Java绘制的时钟小程序"是一个结合了图形绘制、时间处理和动画技术的项目,它能帮助开发者深入理解Java GUI编程的基本原理和实践技巧。通过这个项目,开发者可以锻炼到面向对象设计、图形用户界面的...

    Java GUI钟表。。。

    在Java编程中,GUI(图形用户界面)是创建与用户交互的应用程序的一种方式。本示例涉及使用Java GUI创建一个钟表,展示时、分、秒三根指针的动态旋转,以反映系统的当前时间,并实时更新指针位置。下面我们将深入...

    java图形界面时钟

    为了绘制时钟的指针,开发者需要了解如何用直线或曲线表示时针、分针和秒针,并根据当前时间调整它们的角度。例如,时针每小时转动30度,分针每分钟转动6度,秒针则是每秒转动6度。 描述中还指出时针的跳动过大,这...

    java图形时钟[源码][附图]

    2. **创建时钟显示组件**:这可能是自定义的`JLabel`或者`JPanel`,通过重绘方法(`paintComponent()`在`JPanel`)来绘制时钟的指针和数字。 3. **设置定时器**:创建`javax.swing.Timer`对象,指定间隔时间(例如1000...

    java真图时钟.zip_JAVA时钟_java 时钟_时钟 java_时钟 java

    这个项目展示了如何在Java中利用图形用户界面(GUI)来创建一个实时更新的时钟。以下是对这个项目涉及的知识点的详细解释: 1. **Java GUI**:Java GUI(图形用户界面)是Java编程中的一个重要部分,它允许开发者...

    java实现模拟时钟

    要实现模拟时钟的效果,开发者可能创建了自定义组件,继承自JComponent或者直接使用Graphics2D API在已有的组件上绘制时钟的指针和刻度。自定义组件可以重写paintComponent()方法进行绘制。 6. **事件监听**: 在...

    java图形时钟基于自带多媒体编程

    在这个时钟程序中,开发者可能使用了AWT的`Canvas`类来绘制时钟的背景和指针。`Canvas`类提供了基本的绘图功能,允许程序员在屏幕上直接绘制图形。 2. **多媒体编程**: Java支持多媒体编程,允许开发者处理图像、...

    Java课程设计时钟设计

    此外,还利用了`Graphics2D`对象来进行高级绘图操作,例如绘制时钟的表盘和指针。 **代码示例**: ```java public Clock() { super("时钟"); // 设置窗口标题 setSize(250, 250); // 设置窗口大小 setBackground...

    JAVA 模拟时钟实验报告

    在系统设计和实施部分,报告详细描述了从创建窗口、设置布局、绘制时钟到实现时间更新和秒表功能的整个过程。通过这个实验,学生不仅可以掌握Java GUI编程的基本技巧,还能深入理解多线程、图形绘制和事件处理等核心...

    Java练手_电子时钟

    AWT是Java的一个原始图形用户界面(GUI)工具包,它提供了基本的组件和画布(Canvas)用于绘制自定义图形。在这个电子时钟项目中,我们可能会创建一个`Canvas`子类,重写`paint()`方法,在其中使用`Graphics`对象来...

    java编写的时钟程序

    时钟程序通常会在`JFrame`中创建一个`JPanel`来绘制时钟的界面。 4. **Graphics2D绘图**:在`JPanel`上绘制时钟需要使用`Graphics2D`接口。你可以通过重写`paintComponent()`方法来实现自定义绘图,如画出时钟的...

    JAVA做的时钟,很漂亮

    时钟的显示可能通过继承JComponent或JavaFX的Node类并重写paintComponent()方法来实现,该方法用于绘制时钟的小时、分钟和秒针。开发者可能使用Graphics2D对象进行绘制,它可以进行精确的几何形状绘制和文本渲染。...

    Java设计简单时钟

    4. **绘制时钟**:在`ClockPanel`中,我们需要重写`paintComponent(Graphics g)`方法,利用`Graphics`对象来绘制时钟的背景、数字和指针。可以使用`g.setColor()`设置颜色,`g.drawLine()`画线,`g.fillOval()`填充...

    用java编写的时钟小程序

    此程序使用了AWT(Abstract Window Toolkit)来绘制时钟界面。 3. **Thread**: Java中的线程类,用于实现多线程编程,使得时钟能够实时更新而不阻塞UI。 4. **Calendar**: 用于操作日期和时间的对象,可以获取当前...

    java实现的动画电子时钟

    在我们的电子时钟中,我们将使用它来绘制时钟的数字、指针等元素。这通常涉及到设置颜色、线宽、坐标系统调整以及绘制线条和形状。 5. **定时器(Timer)**: - javax.swing.Timer 类用于在指定间隔后执行重复任务...

    java时钟_表盘数字

    开发者会利用`drawLine()`方法画出时钟的刻度线,`drawArc()`或`fillArc()`方法绘制时钟的圆盘和数字。通过`translate()`和`rotate()`方法调整坐标轴,使指针可以指向正确的角度。 3. **时间更新机制**: 为了实时...

Global site tag (gtag.js) - Google Analytics