溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java 畫時鐘遇到的問題及解決方法

發(fā)布時間:2021-11-05 13:39:49 來源:億速云 閱讀:141 作者:柒染 欄目:開發(fā)技術(shù)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Java 畫時鐘遇到的問題及解決方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1.不能一直得到當前的時間,導致刷新時間不變。

剛開始我自以為把int s = calendar.get(Calendar.SECOND)放到一個線程線程里再刷新就可以看到秒的變化了,

可惜結(jié)果并不是我想到那樣,畫面并沒有任何變化。

然后我一頓亂操作,最后還是得去問老師。/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~

讓我知道了還有時間監(jiān)聽器這個東西,看來我知道還是太少啦 (;′⌒`)

加入下列代碼就行啦

Java 畫時鐘遇到的問題及解決方法

2.piant方法里

g.drawString("s",x,y)刷新的時候后一個數(shù)字覆蓋前一個數(shù)字,假如秒從0開始,下一秒的1會直接畫在0上,原來的0不會消失,drawLine()也是如此。如下圖

Java 畫時鐘遇到的問題及解決方法

為什么會有這個問題呢?

因為你之前畫上去的沒有擦掉,所以全混在一起

然后咋解決呢?

想到用g.clearRect()去解決,發(fā)現(xiàn)位置有點難調(diào)。/(ㄒoㄒ)/~~

調(diào)了半天然后發(fā)現(xiàn)直接覆蓋了連內(nèi)容都不顯示了 /(ㄒoㄒ)/~~ 不知道是不是我的用法有錯 ≧ ﹏ ≦

到這里我只能去找度娘求助。

找到了一個好辦法 上圖:

Java 畫時鐘遇到的問題及解決方法

也就是圖上兩行代碼。

調(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)));
    }
}

上述就是小編為大家分享的Java 畫時鐘遇到的問題及解決方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI