Java GUI组件练习用Demo,主要是为了学习GUI的设计思路、组件的特性。这里的代码并不是最优雅的解决方案,千万别纠结这个……
要点:
- 绘图的框架应该继承自JFrame,具体组件继承自JPanel。
- 继承自JPanel的类覆写父类(JComponent)的paintComponent()方法,注意不是Container的paintComponents()!
- 这些都是不能重用的组件,所以要刷新则调用repaint(),此处在每次调用setter方法的时候进行调用。
- 通过时分秒计算时针、分针、秒针的位置需要用三角函数的知识。
- 在计算时针和分针角度时,秒数对其影响太小(为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(); } }
参考资料:
相关推荐
在 DrawClock 类中,我们使用了 Java 语言中的图形绘制类 Graphics 来绘制时钟。我们首先定义了时针、分针和秒针的终点坐标,然后使用 Graphics 类的 drawLine 方法绘制时针、分针和秒针。 四、 数学公式 在绘制...
- `paint()`方法会使用`Graphics`对象来绘制时钟的背景、数字、分针、时针和秒针。`Graphics`类提供了各种绘图操作,如填充、描边、绘制线条和形状。 4. **Java GUI和AWT库**: - Java Applet的图形绘制是通过...
总的来说,这个"Java绘制的时钟小程序"是一个结合了图形绘制、时间处理和动画技术的项目,它能帮助开发者深入理解Java GUI编程的基本原理和实践技巧。通过这个项目,开发者可以锻炼到面向对象设计、图形用户界面的...
在Java编程中,GUI(图形用户界面)是创建与用户交互的应用程序的一种方式。本示例涉及使用Java GUI创建一个钟表,展示时、分、秒三根指针的动态旋转,以反映系统的当前时间,并实时更新指针位置。下面我们将深入...
为了绘制时钟的指针,开发者需要了解如何用直线或曲线表示时针、分针和秒针,并根据当前时间调整它们的角度。例如,时针每小时转动30度,分针每分钟转动6度,秒针则是每秒转动6度。 描述中还指出时针的跳动过大,这...
2. **创建时钟显示组件**:这可能是自定义的`JLabel`或者`JPanel`,通过重绘方法(`paintComponent()`在`JPanel`)来绘制时钟的指针和数字。 3. **设置定时器**:创建`javax.swing.Timer`对象,指定间隔时间(例如1000...
这个项目展示了如何在Java中利用图形用户界面(GUI)来创建一个实时更新的时钟。以下是对这个项目涉及的知识点的详细解释: 1. **Java GUI**:Java GUI(图形用户界面)是Java编程中的一个重要部分,它允许开发者...
要实现模拟时钟的效果,开发者可能创建了自定义组件,继承自JComponent或者直接使用Graphics2D API在已有的组件上绘制时钟的指针和刻度。自定义组件可以重写paintComponent()方法进行绘制。 6. **事件监听**: 在...
在这个时钟程序中,开发者可能使用了AWT的`Canvas`类来绘制时钟的背景和指针。`Canvas`类提供了基本的绘图功能,允许程序员在屏幕上直接绘制图形。 2. **多媒体编程**: Java支持多媒体编程,允许开发者处理图像、...
此外,还利用了`Graphics2D`对象来进行高级绘图操作,例如绘制时钟的表盘和指针。 **代码示例**: ```java public Clock() { super("时钟"); // 设置窗口标题 setSize(250, 250); // 设置窗口大小 setBackground...
在系统设计和实施部分,报告详细描述了从创建窗口、设置布局、绘制时钟到实现时间更新和秒表功能的整个过程。通过这个实验,学生不仅可以掌握Java GUI编程的基本技巧,还能深入理解多线程、图形绘制和事件处理等核心...
AWT是Java的一个原始图形用户界面(GUI)工具包,它提供了基本的组件和画布(Canvas)用于绘制自定义图形。在这个电子时钟项目中,我们可能会创建一个`Canvas`子类,重写`paint()`方法,在其中使用`Graphics`对象来...
时钟程序通常会在`JFrame`中创建一个`JPanel`来绘制时钟的界面。 4. **Graphics2D绘图**:在`JPanel`上绘制时钟需要使用`Graphics2D`接口。你可以通过重写`paintComponent()`方法来实现自定义绘图,如画出时钟的...
时钟的显示可能通过继承JComponent或JavaFX的Node类并重写paintComponent()方法来实现,该方法用于绘制时钟的小时、分钟和秒针。开发者可能使用Graphics2D对象进行绘制,它可以进行精确的几何形状绘制和文本渲染。...
4. **绘制时钟**:在`ClockPanel`中,我们需要重写`paintComponent(Graphics g)`方法,利用`Graphics`对象来绘制时钟的背景、数字和指针。可以使用`g.setColor()`设置颜色,`g.drawLine()`画线,`g.fillOval()`填充...
此程序使用了AWT(Abstract Window Toolkit)来绘制时钟界面。 3. **Thread**: Java中的线程类,用于实现多线程编程,使得时钟能够实时更新而不阻塞UI。 4. **Calendar**: 用于操作日期和时间的对象,可以获取当前...
在我们的电子时钟中,我们将使用它来绘制时钟的数字、指针等元素。这通常涉及到设置颜色、线宽、坐标系统调整以及绘制线条和形状。 5. **定时器(Timer)**: - javax.swing.Timer 类用于在指定间隔后执行重复任务...
开发者会利用`drawLine()`方法画出时钟的刻度线,`drawArc()`或`fillArc()`方法绘制时钟的圆盘和数字。通过`translate()`和`rotate()`方法调整坐标轴,使指针可以指向正确的角度。 3. **时间更新机制**: 为了实时...