一个awt做的模拟时钟的例子(代码来源Java2程序设计150例)
很简单,应该很容易看懂,
第二个例子在第一例子的基础上进行了小修改在swt上运行awt,swing。
java 代码
很简单,应该很容易看懂,
第二个例子在第一例子的基础上进行了小修改在swt上运行awt,swing。
java 代码
- import java.awt.*;
- import java.awt.event.*;
- import java.awt.geom.*;
我把例子做了一些修改让他在swt的基础上运行。
java 代码
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.util.Calendar;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Swt_awtClock extends JPanel implements ActionListener{
// 创建时钟的外形
protected static Ellipse2D face = new Ellipse2D.Float(3, 3, 94, 94);
// 创建时钟的标记
protected static GeneralPath tick = new GeneralPath();
static
{
tick.moveTo(100, 100);
tick.moveTo(49, 0);
tick.lineTo(51, 0);
tick.lineTo(51, 6);
tick.lineTo(49, 6);
tick.lineTo(49, 0);
}
// 创建时针
protected static GeneralPath hourHand = new GeneralPath();
static
{
hourHand.moveTo(50, 15);
hourHand.lineTo(53, 50);
hourHand.lineTo(50, 53);
hourHand.lineTo(47, 50);
hourHand.lineTo(50, 15);
}
// 创建分针
protected static GeneralPath minuteHand = new GeneralPath();
static
{
minuteHand.moveTo(50, 2);
minuteHand.lineTo(53, 50);
minuteHand.lineTo(50, 58);
minuteHand.lineTo(47, 50);
minuteHand.lineTo(50, 2);
}
// 创建秒针
protected static GeneralPath secondHand = new GeneralPath();
static
{
secondHand.moveTo(49, 5);
secondHand.lineTo(51, 5);
secondHand.lineTo(51, 62);
secondHand.lineTo(49, 62);
secondHand.lineTo(49, 5);
}
// 设置时钟的颜色
protected static Color faceColor = new Color(220, 220, 220);
protected static Color hourColor = Color.red.darker();
protected static Color minuteColor = Color.blue.darker();
protected static Color secondColor = new Color(180, 180, 0);
protected static Color pinColor = Color.gray.brighter();
// 创建时钟的枢纽
protected Ellipse2D pivot = new Ellipse2D.Float(47, 47, 6, 6);
protected Ellipse2D centerPin = new Ellipse2D.Float(49, 49, 2, 2);
// 创建绕时钟枢纽转的变换
protected AffineTransform hourTransform =
AffineTransform.getRotateInstance(0, 50, 50);
protected AffineTransform minuteTransform =
AffineTransform.getRotateInstance(0, 50, 50);
protected AffineTransform secondTransform =
AffineTransform.getRotateInstance(0, 50, 50);
// 创建每秒触发一次的Timer
protected Timer timer = new Timer(1000, this);
protected Calendar calendar = Calendar.getInstance();
public Swt_awtClock()
{
setPreferredSize(new Dimension(100, 100));
}
// 当plane加入container中时发生
public void addNotify()
{
super.addNotify();
timer.start();
}
// 当plane从container中移处时发生
public void removeNotify()
{
timer.stop();
super.removeNotify();
}
public void actionPerformed(ActionEvent event)
{
// 更新calender的时间
this.calendar.setTime(new java.util.Date());
int hours = this.calendar.get(Calendar.HOUR);
int minutes = this.calendar.get(Calendar.MINUTE);
int seconds = this.calendar.get(Calendar.SECOND);
//设置变换,使得时针、分针、秒针各自按绕枢纽旋转一定的角度
hourTransform.setToRotation(((double) hours) *
(Math.PI / 6.0), 50, 50);
minuteTransform.setToRotation(((double) minutes) *
(Math.PI / 30.0), 50, 50);
secondTransform.setToRotation(((double) seconds) *
(Math.PI / 30.0), 50, 50);
repaint();
}
public void paint(Graphics g)
{
super.paint(g);
// 得到图形上下文和抗锯齿处理
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(faceColor);
g2.fill(face);
g2.setPaint(Color.black);
g2.draw(face);
// 产生钟面上12个滴答位置
for (double p = 0.0; p < 12.0; p += 1.0)
{
//利用变换画出同心的滴答的标线
g2.fill(tick.createTransformedShape(
AffineTransform.getRotateInstance((Math.PI / 6.0) * p,
50, 50)));
}
g2.setPaint(hourColor);
g2.fill(hourHand.createTransformedShape(hourTransform));
g2.setPaint(minuteColor);
g2.fill(minuteHand.createTransformedShape(minuteTransform));
g2.setPaint(secondColor);
g2.fill(secondHand.createTransformedShape(secondTransform));
g2.fill(pivot);
g2.setPaint(pinColor);
g2.fill(centerPin);
}
public static void main(String[] args) {
final Display display = new Display( );
final Shell shell = new Shell(display);
shell.setText("Using Swing and AWT in Swt");
shell.setSize(135, 145);
shell.setLayout(new FillLayout());
Composite composite = new Composite(shell, SWT.EMBEDDED);
java.awt.Frame frame = SWT_AWT.new_Frame(composite);
frame.setLocation(700, 400);
// frame.getContentPane().add(new Swt_awtClock());
java.awt.Panel panel = new java.awt.Panel( );
frame.add(panel);
panel.add(new Swt_awtClock());
frame.pack();
frame.show();
shell.open( );
while(!shell.isDisposed( )) {
if (!display.readAndDispatch( )) display.sleep( );
}
display.dispose( );
}
}