- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个游戏。我想要一个类似时钟的东西,显示从游戏开始到现在已经过去了多长时间。它工作得几乎很好,但它的启动可能比实际游戏开始晚一两秒。我不知道这是什么原因,所以我将不胜感激任何帮助。谢谢!
我创建了类似的情况(可运行)。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.Timer;
public class GUI extends javax.swing.JFrame {
private Timer SimpleTimer;
public GUI() {
initComponents();
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(154, 154, 154)
.addComponent(jLabel1))
.addGroup(layout.createSequentialGroup()
.addGap(131, 131, 131)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(196, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(92, Short.MAX_VALUE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(48, 48, 48)
.addComponent(jLabel1)
.addGap(137, 137, 137))
);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
startGame();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private void startGame() {
long startTime = System.currentTimeMillis();
if(SimpleTimer != null) {
SimpleTimer.stop();
}
SimpleTimer = new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
long millis = System.currentTimeMillis() - startTime;
jLabel1.setText("Time passed: " + String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
}
});
SimpleTimer.start();
}
}
最佳答案
你的时间计算看起来不太对劲。不应该是这样的吗:
String text = String.format(TIME_FORMAT,
TimeUnit.MILLISECONDS.toHours(millis) % 24,
TimeUnit.MILLISECONDS.toMinutes(millis) % 60,
TimeUnit.MILLISECONDS.toSeconds(millis) % 60);
timerLabel.setText("Time passed: " + text);
编辑:不,您的转换没问题。如果您显示 1 秒单位,我建议您的计时器使用比 1 秒更细的粒度。这里我使用的粒度是100毫秒。
请注意,您的代码无法为我运行(尝试复制并运行您发布的代码以查看它的作用)。
请查看 MCVE 是什么?应如下所示,然后复制并运行此代码以查看是否有效的计时器:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
import javax.swing.*;
@SuppressWarnings("serial")
public class SimpleTimer extends JPanel {
private static final String TIME_FORMAT = "%02d:%02d:%02d";
public static final int TIMER_DELAY = 100;
private static final int PREF_W = 300;
private static final int PREF_H = 100;
private long startTime;
private Timer myTimer;
private JLabel timerLabel = new JLabel("00:00:00");
private JCheckBox fastChkBox = new JCheckBox("Run Artificially Fast", false);
public SimpleTimer() {
JPanel centerPanel = new JPanel(new GridBagLayout());
centerPanel.add(new JButton(new RestartAction("Restart", KeyEvent.VK_R)));
centerPanel.add(fastChkBox);
JPanel topPanel = new JPanel();
topPanel.add(new JLabel("Time passed: "));
topPanel.add(timerLabel);
setLayout(new BorderLayout());
add(topPanel, BorderLayout.PAGE_START);
add(centerPanel, BorderLayout.CENTER);
}
private class RestartAction extends AbstractAction {
public RestartAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
if (myTimer != null && myTimer.isRunning()) {
myTimer.stop();
}
startTime = System.currentTimeMillis();
myTimer = new Timer(TIMER_DELAY, new TimerListener());
myTimer.start();
}
}
// make it bigger
@Override
public Dimension getPreferredSize() {
Dimension superSz = super.getPreferredSize();
if (isPreferredSizeSet()) {
return superSz;
}
int prefW = Math.max(superSz.width, PREF_W);
int prefH = Math.max(superSz.height, PREF_H);
return new Dimension(prefW, prefH);
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
long millis = System.currentTimeMillis() - startTime;
if (fastChkBox.isSelected()) {
millis *= 512; // make time go faster
}
String text = String.format(TIME_FORMAT,
TimeUnit.MILLISECONDS.toHours(millis) % 24,
TimeUnit.MILLISECONDS.toMinutes(millis) % 60,
TimeUnit.MILLISECONDS.toSeconds(millis) % 60);
timerLabel.setText(text);
}
}
private static void createAndShowGui() {
SimpleTimer mainPanel = new SimpleTimer();
JFrame frame = new JFrame("SimpleTimer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
<小时/>
编辑:没有 NetBeans 构建器垃圾的代码:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.JPanel;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class GUI extends javax.swing.JFrame {
private Timer SimpleTimer;
public GUI() {
initComponents();
}
private void initComponents() {
jLabel1 = new javax.swing.JLabel(" Time passed: 00:00:00 ");
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Restart");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
JPanel btnPanel = new JPanel();
btnPanel.add(jButton1);
JPanel labelPanel = new JPanel();
labelPanel.add(jLabel1);
setLayout(new BorderLayout());
add(labelPanel, BorderLayout.PAGE_START);
add(btnPanel, BorderLayout.CENTER);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
startGame();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private void startGame() {
long startTime = System.currentTimeMillis();
if (SimpleTimer != null) {
SimpleTimer.stop();
}
SimpleTimer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long millis = System.currentTimeMillis() - startTime;
jLabel1.setText("Time passed: " + String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES
.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
}
});
SimpleTimer.start();
}
}
关于Java - Swing 计时器开始显示的时间比预期晚一些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42376025/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!