亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

使用Swing怎么繪制一個動態時鐘效果

發布時間:2021-03-10 16:41:54 來源:億速云 閱讀:197 作者:Leah 欄目:編程語言

使用Swing怎么繪制一個動態時鐘效果?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

線程

利用線程實現刷新,刷新間隔是1秒,每次刷新都先生成當前的時間,然后JVM又會自動調用paintComponent方法繪制圖形,這樣就好像時鐘動起來了。

Thread thread = new Thread(){
      public void run(){
        while(true){
          StillClock clock = new StillClock();
          MessagePanel messagePanel1=new MessagePanel(clock.getHour()+":"+
              clock.getMinute()+":"+clock.getSecond());
          //設置顯示居中
          messagePanel1.setCentered(true);
          //設置前景顏色
          messagePanel1.setForeground(Color.black);
          //設置字體
          messagePanel1.setFont(new Font("Courier",Font.BOLD,16));

          add(clock);
          add(messagePanel1,BorderLayout.SOUTH);
          clock.setVisible(true);
          validate();    //接下來會每隔一秒重繪一次時鐘——即(從frame中將clock組件刪除),因此調用validate方法,使容器重新布置其子組件
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          clock.setVisible(false);
          remove(clock);   //在父容器中將其刪除
          clock.invalidate();    //使容器失效
        }
      }
    };
    thread.start();

線程代碼解析

Thread thread = new Thread(){};

注意結尾使用了分號,既然使用了線程,那么需要重寫它的run方法:

public void run(){}

既然想讓時鐘一直動起來,那么死循環是最好的選擇

while(true){}

在while里面,每次都先生成當前的時間:

StillClock clock = new StillClock();

這里生成了一個無參構造的StillClock類,StillClock的無參構造方法里面會自動生成當前的時間。

注意:這里的StillClock是我自己定義的,代碼貼在后面,但是如果不關心他是怎么實現的,可以直接忽略原理,直接使用,包括代碼里面的messagePanel也是一樣的自定義類。

時間生成完了之后,把時鐘圖形、當前時間的字符串、布局位置利用add()方法繪制到屏幕上

add(clock);
add(messagePanel1,BorderLayout.SOUTH);

接下來會每隔一秒重繪一次時鐘——即(從frame中將clock組件刪除),因此調用validate方法,使容器重新布置其子組件。

thread.start();

讓線程開始工作把。

完整代碼

DisplayClock.java:

package Test;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

public class DisplayClock extends JFrame {
  public DisplayClock(){
    //創建一個現在的時間
    StillClock clock=new StillClock();
    //獲取當前的時間
    clock.setCurrentTime();
    //設置時間的顯示格式

    Thread thread = new Thread(){
      public void run(){
        while(true){
          StillClock clock = new StillClock();
          MessagePanel messagePanel1=new MessagePanel(clock.getHour()+":"+
              clock.getMinute()+":"+clock.getSecond());
          //設置顯示居中
          messagePanel1.setCentered(true);
          //設置前景顏色
          messagePanel1.setForeground(Color.black);
          //設置字體
          messagePanel1.setFont(new Font("Courier",Font.BOLD,16));

          add(clock);
          add(messagePanel1,BorderLayout.SOUTH);
          clock.setVisible(true);
          validate();    //接下來會每隔一秒重繪一次時鐘——即(從frame中將clock組件刪除),因此調用validate方法,使容器重新布置其子組件
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          clock.setVisible(false);
          remove(clock);   //在父容器中將其刪除
          clock.invalidate();    //使容器失效
        }
      }
    };
    thread.start();
    //布局默認為BorderLayout,讓顯示信息在底部(即南邊)

  }

  public static void main(String[] args) {
    DisplayClock frame=new DisplayClock();
    frame.setTitle("DisplayClock");
    frame.setSize(300,350);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);


  }
}

StillClock.java:

package Test;

import sun.util.calendar.Gregorian;

import javax.swing.*;
import java.awt.*;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class StillClock extends JPanel {
  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();
  }

  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;
  }

  //使用Graphics類繪制圖形,需要重寫paintComponent方法
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //繪制時鐘參數
    int clockRadius=(int)(Math.min(getWidth(),getHeight())*0.8*0.5);
    int xCenter=getWidth()/2;
    int yCenter=getHeight()/2;

    //繪制一個圓
    g.setColor(Color.BLACK);
    g.drawOval(xCenter-clockRadius,yCenter-clockRadius,2*clockRadius
    ,2*clockRadius);
    g.drawString("12",xCenter-5,yCenter-clockRadius+12);
    g.drawString("9",xCenter-clockRadius+3,yCenter+5);
    g.drawString("3",xCenter+clockRadius-10,yCenter
    +3);
    g.drawString("6",xCenter-3,yCenter+clockRadius-3);

    //繪制秒針
    int sLength=(int)(clockRadius*0.8);
    int xSecond=(int)(xCenter+sLength*Math.sin(second*(2*Math.PI/60)));
    int ySecond=(int)(xCenter-sLength*Math.cos(second*(2*Math.PI/60)));
    g.setColor(Color.red);
    g.drawLine(xCenter,yCenter,xSecond,ySecond);

    //繪制分針
    int mLength=(int)(clockRadius*0.65);
    int xMinute=(int)(xCenter+mLength*Math.sin(minute*(2*Math.PI/60)));
    int yMinute=(int)(xCenter-mLength*Math.cos(minute*(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.0)*(2*Math.PI/12)));
    int yHour=(int)(xCenter-hLength*Math.cos((hour%12+minute/60.0)*(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 Dimension getPreferredSize(){
    return new Dimension(200,200);
  }
}

messagePanel:

package Test;

import javax.swing.*;
import java.awt.*;

public class MessagePanel extends JPanel {
  //顯示的信息
  private String message="Welcome to java";
  //顯示信息x的坐標
  private int xCoordinate=20;
  //顯示信息y的坐標
  private int yCoordinate=20;
  //信息是否被顯示在中心部位
  private boolean centered;
  //水平和垂直的移動顯示信息
  private int interval=10;

  public int getXCoordinate() {
    return xCoordinate;
  }

  public void setXCoordinate(int xCoordinate) {
    this.xCoordinate = xCoordinate;
    repaint();
  }

  //無參構造
  public MessagePanel() {
  }
  //帶參構造
  public MessagePanel(String message) {
    this.message = message;
    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();

  }

  @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);
  }
  //讓信息往左邊移動
  public void moveLeft(){
    xCoordinate-=interval;
    repaint();
}
  //讓信息往右邊移動
  public void moveRight(){
    xCoordinate+=interval;
    repaint();
  }
  //讓信息向上移動
  public void moveUp(){
    yCoordinate+=interval;
    repaint();
  }
  public void moveDown(){
    yCoordinate-=interval;
    repaint();
  }
  //固定寫法,不必探究
  @Override
  public Dimension getPreferredSize() {
    return new Dimension(200,30);
  }
}

看完上述內容,你們掌握使用Swing怎么繪制一個動態時鐘效果的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

淮北市| 昌都县| 岳西县| 贡嘎县| 扎赉特旗| 政和县| 老河口市| 潍坊市| 桦川县| 永安市| 张家川| 阿勒泰市| 米易县| 汝阳县| 定结县| 集贤县| 阳西县| 江陵县| 普宁市| 确山县| 泰宁县| 定襄县| 玛沁县| 嘉黎县| 宁远县| 利辛县| 伊通| 昌都县| 临湘市| 永安市| 民乐县| 惠来县| 阳原县| 余庆县| 长岛县| 邮箱| 天门市| 同德县| 灵石县| 饶平县| 牙克石市|