我仿照Java核心技术里面的一个程序,输入小时和分钟,在一个圆里面实现时针和分针。现在程序可以运行,但是在Debug的时候,由于我在画时钟的类的paintcomponent设置了一个断点,只要从代码切换到图形,就会停在这个地方。paintcomponent方法不是应该就在初始化的时候调用一次码,为什么总要执行。
下面是我的代码:
import java.awt.*;
import java.awt.geom.*;
import java.awt.geom.Ellipse2D.Double;
import javax.swing.event.*;import javax.swing.*;public class TextTest {
public static void main(String[] args) {
// Add a frame
TextTestFrame frame = new TextTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}// Create a clock frame
class TextTestFrame extends JFrame {
public TextTestFrame() {
setTitle("TextTest"); // Draw the bottom line
JPanel panel = new JPanel();
JLabel label = new JLabel("Hours:");
panel.add(label);
hour_text = new JTextField("12", 3);
panel.add(hour_text);
JLabel label2 = new JLabel("Minutes:");
panel.add(label2);
minute_text = new JTextField("00", 3);
panel.add(minute_text);
add(panel, BorderLayout.SOUTH); // Add the listener
clockFieldListener listener = new clockFieldListener();
hour_text.getDocument().addDocumentListener(listener);
minute_text.getDocument().addDocumentListener(listener); // Draw clock panel
clockPanel = new DrawPanel();
add(clockPanel, BorderLayout.CENTER);
pack();
} public void DrawClock() {
try {
clockPanel.setTime(Integer.parseInt(hour_text.getText()), Integer
.parseInt(minute_text.getText()));
clockPanel.repaint();
} catch (NumberFormatException e) {
//
}
} public JTextField hour_text;
public JTextField minute_text;
public DrawPanel clockPanel; public class clockFieldListener implements DocumentListener {
public void insertUpdate(DocumentEvent event) {
DrawClock();
} public void changedUpdate(DocumentEvent event) { } public void removeUpdate(DocumentEvent event) {
DrawClock();
}
}
}class DrawPanel extends JPanel {
public DrawPanel() {
setPreferredSize(new Dimension(2 * RADIUS + 1, 2 * RADIUS + 1));
} public void paintComponent(Graphics g) { --就是这里了,Debug的时候只要切换出去就会又停在这里
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g; // Draw the circle
Ellipse2D elli = new Ellipse2D.Double();
elli.setFrameFromCenter(new Point2D.Double(RADIUS, RADIUS),
new Point2D.Double(0, 0));
g2.draw(elli); // Draw the hour hand and minute hand
double hourAngle = Math.toRadians(90 - 360 * minute / (12 * 60));
DrawHand(g2, hourAngle, HOUR_HAND_LENGTH); // Draw the minute hand
double minuteAngle = Math.toRadians(90 - 360 * minute / 60);
DrawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
} public void DrawHand(Graphics2D g2, double angle, double length) {
Point2D p = new Point2D.Double(RADIUS + length * Math.cos(angle),
RADIUS - length * Math.sin(angle));
g2.draw(new Line2D.Double(p, new Point2D.Double(RADIUS, RADIUS)));
} public void setTime(int h, int m) {
minute = h * 60 + m;
} public static final int RADIUS = 100;
private double minute = 0;
private double HOUR_HAND_LENGTH = 0.6 * RADIUS;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
}
下面是我的代码:
import java.awt.*;
import java.awt.geom.*;
import java.awt.geom.Ellipse2D.Double;
import javax.swing.event.*;import javax.swing.*;public class TextTest {
public static void main(String[] args) {
// Add a frame
TextTestFrame frame = new TextTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}// Create a clock frame
class TextTestFrame extends JFrame {
public TextTestFrame() {
setTitle("TextTest"); // Draw the bottom line
JPanel panel = new JPanel();
JLabel label = new JLabel("Hours:");
panel.add(label);
hour_text = new JTextField("12", 3);
panel.add(hour_text);
JLabel label2 = new JLabel("Minutes:");
panel.add(label2);
minute_text = new JTextField("00", 3);
panel.add(minute_text);
add(panel, BorderLayout.SOUTH); // Add the listener
clockFieldListener listener = new clockFieldListener();
hour_text.getDocument().addDocumentListener(listener);
minute_text.getDocument().addDocumentListener(listener); // Draw clock panel
clockPanel = new DrawPanel();
add(clockPanel, BorderLayout.CENTER);
pack();
} public void DrawClock() {
try {
clockPanel.setTime(Integer.parseInt(hour_text.getText()), Integer
.parseInt(minute_text.getText()));
clockPanel.repaint();
} catch (NumberFormatException e) {
//
}
} public JTextField hour_text;
public JTextField minute_text;
public DrawPanel clockPanel; public class clockFieldListener implements DocumentListener {
public void insertUpdate(DocumentEvent event) {
DrawClock();
} public void changedUpdate(DocumentEvent event) { } public void removeUpdate(DocumentEvent event) {
DrawClock();
}
}
}class DrawPanel extends JPanel {
public DrawPanel() {
setPreferredSize(new Dimension(2 * RADIUS + 1, 2 * RADIUS + 1));
} public void paintComponent(Graphics g) { --就是这里了,Debug的时候只要切换出去就会又停在这里
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g; // Draw the circle
Ellipse2D elli = new Ellipse2D.Double();
elli.setFrameFromCenter(new Point2D.Double(RADIUS, RADIUS),
new Point2D.Double(0, 0));
g2.draw(elli); // Draw the hour hand and minute hand
double hourAngle = Math.toRadians(90 - 360 * minute / (12 * 60));
DrawHand(g2, hourAngle, HOUR_HAND_LENGTH); // Draw the minute hand
double minuteAngle = Math.toRadians(90 - 360 * minute / 60);
DrawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
} public void DrawHand(Graphics2D g2, double angle, double length) {
Point2D p = new Point2D.Double(RADIUS + length * Math.cos(angle),
RADIUS - length * Math.sin(angle));
g2.draw(new Line2D.Double(p, new Point2D.Double(RADIUS, RADIUS)));
} public void setTime(int h, int m) {
minute = h * 60 + m;
} public static final int RADIUS = 100;
private double minute = 0;
private double HOUR_HAND_LENGTH = 0.6 * RADIUS;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
}
解决方案 »
- 有关线程的问题
- WebDynPro开发的问题
- 在java中如何播放mp3(想通过JFM实现)[答案被采用者单独追加100分]
- java小冬冬令我头疼--javax.swing.*; JLabel.setIcon()无法显示图片,,求教哦!~
- 遇到点小问题:请各位帮忙解决哈!或者是给点意见!!!谢谢!!在线等!解决马上给分!!
- 急呀!求救,散分,反编译的一个CLASS文件,怎样把它编辑成可用的代码
- 这个问题有实现的可能吗?
- 我的QQ中的关于socket的问题,请求达人的帮助(有代码)
- 我要疯了。。。
- 【源码分享】Java实现中国象棋
- 如果类的成员变量是一个数组,将他设为私有的后。如果让外界使用他呢?
- 线程选择题,四个选项不明白
关注
paintComponent的原因 可能是界面动了 要刷新