我想知道如何每x秒重绘和更新JPanel的背景…这是我的代码:
package view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private final JLabel score;
private final static String[] BACKGROUND_COLORS = {"black", "blue", "darkpurple", "purple"};
private int i = 0;
public GamePanel() {
this.score = new JLabel("Score: ");
this.score.setBounds(0, 0, 40, 20);
this.score.setOpaque(false);
this.score.setForeground(Color.GREEN);
this.add(score);
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
//Image background = new ImageIcon(this.getClass().getResource("/images/" + BACKGROUND_COLORS[i] + "Background.png")).getImage();
//g.drawImage(background, 0, 0, null);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Image background = new ImageIcon(this.getClass().getResource("/images/" + BACKGROUND_COLORS[i] + "Background.png")).getImage();
g.drawImage(background, 0, 0, null);
revalidate();
repaint();
System.out.println("trying my timer");
i++;
if (i == 4) {
i = 0;
}
}
});
timer.start();
}
}
我的代码有2个问题:1-JPanel根本没有被绘制。2-第一张可以打印,然后每次打印数量增加一倍。有什么建议吗?先感谢您
更新:我以这种方式解决了这个问题:
package view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private final JLabel score;
private int i = 0;
private final static String[] BACKGROUND_COLORS = {"black", "blue", "darkpurple", "purple"};
private final static int DELAY = 10000;
public GamePanel() {
this.score = new JLabel("Score: ");
this.score.setBounds(0, 0, 40, 20);
this.score.setOpaque(false);
this.score.setForeground(Color.GREEN);
this.add(score);
Timer timer = new Timer(DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
i++;
if (i == 4) {
i = 0;
}
}
});
timer.start();
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
Image background = new ImageIcon(this.getClass().getResource("/images/" + BACKGROUND_COLORS[this.i] + "Background.png")).getImage();
g.drawImage(background, 0, 0, null);
revalidate();
repaint();
}
更新2:
package view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private final JLabel score;
private int currentImage;
private final List<Image> backgrounds = new ArrayList<>();
private static final String[] BACKGROUND_COLORS = {"black", "blue", "darkpurple", "purple"};
private static final int DELAY = 1000;
public GamePanel() {
super();
this.score = new JLabel("Score: ");
this.score.setBounds(0, 0, 40, 20);
this.score.setOpaque(false);
this.score.setForeground(Color.GREEN);
this.add(score);
for (final String s : BACKGROUND_COLORS) {
backgrounds.add(new ImageIcon(this.getClass().getResource("/images/" + s + "Background.png")).getImage());
}
final Timer timer = new Timer(DELAY, new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
repaint();
currentImage++;
if (currentImage == BACKGROUND_COLORS.length) {
currentImage = 0;
}
}
});
timer.start();
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.drawImage(backgrounds.get(this.currentImage), 0, 0, null);
}
使用Swing计时器,
class GamePanel extends JPanel implements ActionListener{
Timer timer=new Timer(1000, this);
public GamePanel() {
timer.start();// Start the timer here.
}
public void actionPerformed(ActionEvent ev){
if(ev.getSource()==timer){
repaint();// this will call at every 1 second
}
}
问题内容: 最近我一直在使用带有大量数字的循环来打印Hello World: 我知道这是一种非常愚蠢的方法,但是我从未使用过Java中的任何计时器库。一个如何修改以上内容以每3秒打印一次? 问题答案: 你还可以查看和类,这些类可用于计划任务每秒钟运行一次。 你需要一个扩展并覆盖该方法的类,该类将在每次将该类的实例传递给方法时执行。 这是一个示例,每5秒打印一次:-
最近,我一直使用带有大数字的循环来打印: 我知道这是一个非常愚蠢的方法,但我从来没有使用任何计时器库在Java。如何修改上面的打印每说3秒?
我正在尝试使用 DropWizard 指标库在我的应用程序上测量应用程序和 jvm 级别的指标。 下面是我的度量类,我在代码中使用它来增加/减少度量。我正在调用下面类的< code>increment和< code>decrement方法来递增和递减度量。 下面是我如何使用上面的<code>TestMetrics</code>类来根据需要增加度量的基础。下面的方法由多个线程调用。 现在我有了另一个
问题内容: 我正在将一种布局转换为html; 一旦我在code / html / css中进行了更改,每次必须按F5。是否有任何简单的javascript / jQuery解决方案?即,在添加脚本之后,每5秒(或其他特定时间)重新加载整个页面。 问题答案: 如果必须在脚本中使用setTimeout,例如:
问题内容: 请查找每10秒钟重复一次的更新代码。但是,问题在于它每10秒在屏幕上创建一个新的GUI,而不是仅每10秒更新一次数据。请您指教 问题答案: 您只有一门课,Learningfromscrach。在其中,您具有主要功能。在主要功能内,您将创建 另一个 Learningfromscrach 实例 ,该 实例 现在传递给计时器,每10秒运行一次。当它在10秒内运行时,它会创建另一个Learni
最近我一直在使用带有大量数字的循环来打印: 我知道这是一种非常愚蠢的方法,但我还从未在Java中使用过任何计时器库。如何修改上述内容,使其每3秒打印一次?