我是一個剛入門的小菜鳥,希望我寫的東西可以幫助和我一樣剛入門的兄弟們少走一些彎路,也希望大佬們可以多指點指點我,感謝!
解決在畫時鐘遇到的問題讓我花費不少時間 ~~~~~~ 說兩個困擾我比較久的
1.不能一直得到當前的時間,導致重繪時間不變,
剛開始我自以為把int s = calendar.get(Calendar.SECOND)放到一個執行緒執行緒里再重繪就可以看到秒的變化了,
可惜結果并不是我想到那樣,畫面并沒有任何變化,
然后我一頓亂操作,最后還是得去問老師,/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~
讓我知道了還有時間監聽器這個東西,看來我知道還是太少啦 (;′⌒`)
加入下列代碼就行啦

2.piant方法里g.drawString("s",x,y)重繪的時候后一個數字覆寫前一個數字,假如秒從0開始,下一秒的1會直接畫在0上,原來的0不會消失,drawLine()也是如此,如下圖

為什么會有這個問題呢?
因為你之前畫上去的沒有擦掉,所以全混在一起
然后咋解決呢?
想到用g.clearRect()去解決,發現位置有點難調,/(ㄒoㄒ)/~~
調了半天然后發現直接覆寫了連內容都不顯示了 /(ㄒoㄒ)/~~ 不知道是不是我的用法有錯 ≧ ﹏ ≦
到這里我只能去找度娘求助,
找到了一個好辦法 上圖:

也就是圖上兩行代碼,
呼叫super.paintComponent(g) 問題就被解決了
super.paintComponent(g) 會呼叫組件的原始界面重新繪制,這樣就相當于把上次的擦除啦,
最后把我原始碼附上,請各位指點!
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.http.WebSocket;
import java.net.http.WebSocket.Listener;
import java.util.Calendar;
import java.util.Date;
public class ClockFrame extends JFrame {
ClockFrame() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
ClockFrame frame = new ClockFrame();
ClockPanel panel = new ClockPanel();
frame.add(panel);
panel.setCalendar();
frame.setVisible(true);
}
}
class ClockPanel extends JPanel {
// 畫h:m:s;
Calendar calendar = Calendar.getInstance();
int s = calendar.get(Calendar.SECOND);
int m = calendar.get(Calendar.MINUTE);
int h = calendar.get(Calendar.HOUR);
public void setCalendar() {
Timer timer = new Timer(1000, new Listener());
timer.start();
}
class Listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
s++;
if (s == 60) {
m++;
s = 0;
}
if (m == 60) {
h++;
m = 0;
}
repaint();
}
}
//run 動態
int sx = 190;
int sy = 70;
ClockPanel() {
setBackground(Color.GRAY);
}
public void paint(Graphics g) {
super.paintComponent(g);
// 圓
g.drawOval(83, 57, 220, 220);
//畫點
g.fillOval(190, 170, 5, 5);//Center
for (int i = 12; i > 0; i--) {
g.fillOval((int) (190 + 100 * Math.sin(Math.PI / 6 * i)), (int) (170 + 100 * Math.cos(Math.PI / 6 * i)), 5, 5);
String time = i + "";
g.setFont(new Font("微軟雅黑", Font.BOLD, 15));
g.drawString(time, (int) (190 + Math.sin(Math.PI / 6 * i) * 100), (int) (170 - Math.cos(Math.PI / 6 * i) * 100));
}
g.setFont(new Font("微軟雅黑", Font.BOLD, 20));
String S = s > 10 ? s + "" : "0" + s;
String M = m > 10 ? m + "" : "0" + m;
String H = h > 10 ? h + "" : "0" + h;
g.drawString("現在是中國時間" + H + ":" + M + ":" + S, 80, 40);
final BasicStroke stokeLine = new BasicStroke(3.0f);
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(stokeLine);
g.setColor(Color.black);
g.drawLine(190, 170, (int) (190 + (Math.cos((s * Math.PI / 30) - Math.PI / 2) * 100)), (int) (170 + (Math.sin((s * Math.PI / 30 - Math.PI / 2)) * 100)));
g.setColor(Color.blue);
g.drawLine(190, 170, (int) (190 + (Math.cos((m * Math.PI / 30 - Math.PI / 2)) * 100)), (int) (170 + (Math.sin((m * Math.PI / 30 - Math.PI / 2)) * 100)));
g.setColor(Color.GREEN);
g.drawLine(190, 170, (int) (190 + (Math.cos((h * Math.PI / 12)) * 100)), (int) (170 + ((Math.sin(h * Math.PI / 12)) * 100)));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/348354.html
標籤:java
