gpt4 book ai didi

java - 时间不会在 Applet 中重新绘制

转载 作者:行者123 更新时间:2023-12-01 08:05:58 25 4
gpt4 key购买 nike

我有一个小问题,但我不知道如何解决。我创建了简单的小程序,其中应该是简单的数字时钟。我正确创建了所有方法,但重绘方法不会重绘我的小程序。你能检查一下我的代码并指出错误在哪里吗?谢谢。

public class DigitalClock extends JApplet implements Runnable {

private Thread timeThread;
Date date = new Date();

public void start() {
timeThread = new Thread(this, "Clock");
timeThread.start();
}

@Override
public void stop() {
if (timeThread == null) {
return;
}
timeThread = null;
}

@Override
public void run() {
while (timeThread != null) {
repaint();
try {
timeThread.sleep(1000);
} catch (InterruptedException e) {
}
}
}

@Override
public void paint(Graphics g) {
date.setTime(System.currentTimeMillis());
g.drawString(date.toString(), 50, 95);
}
}

最佳答案

只需使用javax.swing.TimerSee how to use Swing Timer

这是一个例子。但我并没有像您正在做的那样在 JApplet 等顶级容器上绘画,而是在更推荐的 JPanel 上绘画

enter image description here

import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;

public class TimerPanel extends JPanel {

private String dateString;
private final SimpleDateFormat format;
private final Font font;
private final Date date;

public TimerPanel() {
format = new SimpleDateFormat("hh:mm:ss a");
font = new Font("impact", Font.PLAIN, 30);
date = new Date();

date.setTime(System.currentTimeMillis());
dateString = format.format(date);

Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
date.setTime(System.currentTimeMillis());
dateString = format.format(date);
repaint();
}
});
timer.start();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setFont(font);
FontMetrics fm = g.getFontMetrics(font);
int width = fm.stringWidth(dateString);
int height = fm.getAscent();
int x = getWidth() / 2 - width / 2;
int y = getHeight() / 2 + height / 2;

g.drawString(dateString, x, y);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 100);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TimerPanel timer = new TimerPanel();
JOptionPane.showMessageDialog(
null, timer, "Digital Clock", JOptionPane.PLAIN_MESSAGE);
}
});
}
}
<小时/>

更直接地回答你的问题,当我测试你的代码时它是有效的,你唯一忘记做的就是调用super.paint()。这样做后按预期工作

@Override
public void paint(Graphics g) {
super.paint(g);

不过,您需要避免 Thread.sleep 。您可能会注意到这会导致闪烁。最好使用javax.swing.Timer。这就是为什么我首先用我的例子来回答。

关于java - 时间不会在 Applet 中重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21618830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com