有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java模拟时钟工作,但需要几秒钟重新绘制

我制作了一个模拟时钟,它在工作,但当一个删除圆角(背景)的秒针不断重复自己,但当我添加圆角时,它在工作。但我不想看到背景。谢谢

这是密码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Clock extends JPanel implements Runnable {

    Thread thread = null;
    SimpleDateFormat formatter = new SimpleDateFormat("s", Locale.getDefault());
    Date currentDate;
    int xcenter = 175, ycenter = 175, lastxs = 0, lastys = 0, lastxm = 0, lastym = 0, lastxh = 0, lastyh = 0;

    private void drawStructure(Graphics g) {
        g.setFont(new Font("TimesRoman", Font.BOLD, 20));
        g.setColor(Color.black);
//g.fillOval(xcenter - 150, ycenter - 150, 300, 300);
        g.setColor(Color.blue);
        g.setColor(Color.green);
        g.drawString("9", xcenter - 145, ycenter + 0);
        g.drawString("3", xcenter + 135, ycenter + 0);
        g.drawString("12", xcenter - 10, ycenter - 130);
        g.drawString("6", xcenter - 10, ycenter + 145);
    }

    public void paint(Graphics g) {
        int xhour, yhour, xminute, yminute, xsecond, ysecond, second, minute, hour;
        drawStructure(g);
        currentDate = new Date();
        formatter.applyPattern("s");
        second = Integer.parseInt(formatter.format(currentDate));
        formatter.applyPattern("m");
        minute = Integer.parseInt(formatter.format(currentDate));
        formatter.applyPattern("h");
        hour = Integer.parseInt(formatter.format(currentDate));
        xsecond = (int) (Math.cos(second * 3.14f / 30 - 3.14f / 2) * 120 + xcenter);
        ysecond = (int) (Math.sin(second * 3.14f / 30 - 3.14f / 2) * 120 + ycenter);
        xminute = (int) (Math.cos(minute * 3.14f / 30 - 3.14f / 2) * 100 + xcenter);
        yminute = (int) (Math.sin(minute * 3.14f / 30 - 3.14f / 2) * 100 + ycenter);
        xhour = (int) (Math.cos((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter);
        yhour = (int) (Math.sin((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter);
// Erase if necessary, and redraw
        g.drawLine(xcenter, ycenter, xsecond, ysecond);
        g.setColor(Color.red);
        g.drawLine(xcenter, ycenter - 1, xminute, yminute);
        g.drawLine(xcenter - 1, ycenter, xminute, yminute);
        g.setColor(Color.green);
        g.drawLine(xcenter, ycenter - 1, xhour, yhour);
        g.drawLine(xcenter - 1, ycenter, xhour, yhour);
        lastxs = xsecond;
        lastys = ysecond;
        lastxm = xminute;
        lastym = yminute;
        lastxh = xhour;
        lastyh = yhour;
    }

    public void start() {
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void stop() {
        thread = null;
    }

    public void run() {
        while (thread != null) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            repaint();
        }
        thread = null;
    }

    public void update(Graphics g) {
        paint(g);
    }

    public static void main(String args[]) {
        JFrame frame = new JFrame();
        Color c = new Color(118, 73, 190);
        frame.setBackground(c);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, 400, 400);
        Clock clock = new Clock();
        frame.getContentPane().add(clock);
        frame.setVisible(true);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    Swing程序应该重写^{},而不是重写paint()。此外,调用super.paintComponent()以避免这种呈现artifact。类似的问题在这个相关的example中得到了说明。还有一些补充意见:

    image

    经测试:

    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    //* @see https://stackoverflow.com/a/26213625/230513 */
    public class Clock extends JPanel {
    
        private Timer t = new Timer(1000, (ActionEvent e) -> {
            repaint();
        });
        private SimpleDateFormat formatter = new SimpleDateFormat("s", Locale.getDefault());
        private Date currentDate;
        private int xcenter = 175, ycenter = 175, lastxs = 0, lastys = 0, lastxm = 0, lastym = 0, lastxh = 0, lastyh = 0;
    
        private void drawStructure(Graphics g) {
            g.setFont(new Font("TimesRoman", Font.BOLD, 20));
            g.drawString("9", xcenter - 145, ycenter + 0);
            g.drawString("3", xcenter + 135, ycenter + 0);
            g.drawString("12", xcenter - 10, ycenter - 130);
            g.drawString("6", xcenter - 10, ycenter + 145);
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(
                    RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            int xhour, yhour, xminute, yminute, xsecond, ysecond, second, minute, hour;
            drawStructure(g);
            currentDate = new Date();
            formatter.applyPattern("s");
            second = Integer.parseInt(formatter.format(currentDate));
            formatter.applyPattern("m");
            minute = Integer.parseInt(formatter.format(currentDate));
            formatter.applyPattern("h");
            hour = Integer.parseInt(formatter.format(currentDate));
            xsecond = (int) (Math.cos(second * 3.14f / 30 - 3.14f / 2) * 120 + xcenter);
            ysecond = (int) (Math.sin(second * 3.14f / 30 - 3.14f / 2) * 120 + ycenter);
            xminute = (int) (Math.cos(minute * 3.14f / 30 - 3.14f / 2) * 100 + xcenter);
            yminute = (int) (Math.sin(minute * 3.14f / 30 - 3.14f / 2) * 100 + ycenter);
            xhour = (int) (Math.cos((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter);
            yhour = (int) (Math.sin((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter);
            g.drawLine(xcenter, ycenter, xsecond, ysecond);
            g.drawLine(xcenter, ycenter - 1, xminute, yminute);
            g.drawLine(xcenter - 1, ycenter, xminute, yminute);
            g.drawLine(xcenter, ycenter - 1, xhour, yhour);
            g.drawLine(xcenter - 1, ycenter, xhour, yhour);
            lastxs = xsecond;
            lastys = ysecond;
            lastxm = xminute;
            lastym = yminute;
            lastxh = xhour;
            lastyh = yhour;
        }
    
        public void start() {
            t.start();
        }
    
        public void stop() {
            t.stop();
        }
    
        public static void main(String args[]) {
            EventQueue.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setBounds(0, 0, 400, 400);
                Clock clock = new Clock();
                frame.getContentPane().add(clock);
                frame.setVisible(true);
                clock.start();
            });
        }
    }