Java 畫時鐘遇到的問題及解決方案
1.不能一直得到當前的時間,導(dǎo)致刷新時間不變。
剛開始我自以為把int s = calendar.get(Calendar.SECOND)放到一個線程線程里再刷新就可以看到秒的變化了,
可惜結(jié)果并不是我想到那樣,畫面并沒有任何變化。
然后我一頓亂操作,最后還是得去問老師。/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~
讓我知道了還有時間監(jiān)聽器這個東西,看來我知道還是太少啦 (;′⌒`)
加入下列代碼就行啦
2.piant方法里
g.drawString("s",x,y)刷新的時候后一個數(shù)字覆蓋前一個數(shù)字,假如秒從0開始,下一秒的1會直接畫在0上,原來的0不會消失,drawLine()也是如此。如下圖
為什么會有這個問題呢?
因為你之前畫上去的沒有擦掉,所以全混在一起
然后咋解決呢?
想到用g.clearRect()去解決,發(fā)現(xiàn)位置有點難調(diào)。/(ㄒoㄒ)/~~
調(diào)了半天然后發(fā)現(xiàn)直接覆蓋了連內(nèi)容都不顯示了 /(ㄒoㄒ)/~~ 不知道是不是我的用法有錯 ≧ ﹏ ≦
到這里我只能去找度娘求助。
找到了一個好辦法 上圖:
也就是圖上兩行代碼。
調(diào)用super.paintComponent(g) 問題就被解決了
super.paintComponent(g) 會調(diào)用組件的原始界面重新繪制,這樣就相當于把上次的擦除啦。
最后把我源碼附上。請各位指點!
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 動態(tài) 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("現(xiàn)在是中國時間" + 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))); } }
到此這篇關(guān)于Java 畫時鐘遇到的問題及解決方案的文章就介紹到這了,更多相關(guān)Java 畫時鐘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)后臺數(shù)據(jù)顯示在前端
這篇文章主要為大家詳細介紹了java實現(xiàn)后臺數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02springmvc無法訪問/WEB-INF/views下的jsp的解決方法
本篇文章主要介紹了springmvc無法訪問/WEB-INF/views下的jsp的解決方法,非常具有實用價值,需要的朋友可以參考下2017-10-10Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用
這篇文章主要為大家介紹了Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06關(guān)于BufferedReader的read()和readLine()的區(qū)別
這篇文章主要介紹了關(guān)于BufferedReader的read()和readLine()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12