- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我在 stackoverflow 上的第一篇文章,我希望有人能帮助我解决我在这里遇到的问题。
我正在处理的问题是 repaint()
问题,有些人会认为我只是没有在这些论坛上进行足够的搜索来解决我的问题,但我已经进行了广泛的调查,但没有任何效果。在下面的代码中,我尝试在 for 循环中调用 drawB,无论数组有多大,这段代码都能正常运行。 for 循环调用 drawB 大约 20 次。在 drawB 中,我希望设置一个图像(它会因数组中的数字而异)然后调用 repaint()
然后调用 paintComponent()
在子类 GameCanvas 中。
问题是paintComponant 根本没有在这个初始化中运行。然而repaint()
确实在我制作的循环中运行 gameLoop()
,但我需要在 gameLoop()
之前进行初始化.
任何人都知道发生了什么,或者如何解决它?
package engine;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class GameMain extends JFrame // main class for the game as a Swing application
{
// Define constants for the game
static final int CANVAS_WIDTH = 800; // width and height of the game screen
static final int CANVAS_HEIGHT = 600;
static final int UPDATE_RATE = 4; // number of game update per second
static final long UPDATE_PERIOD = 1000000000L / UPDATE_RATE; // nanoseconds
String path;
BufferedImage image;
private GameCanvas canvas;
// Constructor to initialize the UI components and game objects
public GameMain()
{
gameInit();
image = null;
canvas = new GameCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
this.setContentPane(canvas);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("Blockcraft!");
this.setVisible(true);
}
public void gameInit()
{
dispArray();
gameStart();
}
public void dispArray()
{
int tempLevel[][] = new int[][] {{1,1,1,1},{6,2,2,2},{3,3,3,3},{4,4,4,4},{4,4,4,4},{4,4,4,4},{4,4,4,4},{4,4,4,4},{4,4,4,4}};
int widthTemp = tempLevel[0].length;
int heightTemp = tempLevel.length;
for(int i = 0; i < heightTemp; i++)
{
for(int j = 0; j < widthTemp; j++)
{
try
{
image = ImageIO.read(getFile());
}
catch (Exception e)
{
e.printStackTrace();
}
drawB(image);
}
}
}
public File getFile()
{
path = "images//1.jpg";
File file = new File(path);
return file;
}
public void drawB(BufferedImage imgTemp)
{
image = imgTemp;
repaint();
}
private void gameLoop()
{
long beginTime, timeTaken, timeLeft;
while (true)
{
repaint();
beginTime = System.nanoTime();
timeTaken = System.nanoTime() - beginTime;
timeLeft = (UPDATE_PERIOD - timeTaken) / 1000000L; // in milliseconds
if (timeLeft < 10) timeLeft = 10; // set a minimum
try
{
Thread.sleep(timeLeft);
}
catch (InterruptedException ex)
{
//
}
}
}
// Refresh the display. Called back via repaint(), which invoke the paintComponent().
private void gameDraw(Graphics2D g2d)
{
g2d.drawImage(image, 0, 0, 15, 15, this);
}
public void gameKeyPressed(int keyCode)
{
//
}
public void gameKeyReleased(int keyCode)
{
//
}
public void gameKeyTyped(char keyChar)
{
//
}
class GameCanvas extends JPanel implements KeyListener
{
boolean paintAll;
int xPos, yPos;
Image img;
public GameCanvas()
{
setFocusable(true);
requestFocus();
addKeyListener(this);
}
// Override paintComponent to do custom drawing.
// Called back by repaint()... sometimes?
@Override
public void paintComponent(Graphics g)
{
System.out.println("repainting");
Graphics2D g2d = (Graphics2D)g;
// Draw the game objects
gameDraw(g2d);
}
// KeyEvent handlers
@Override
public void keyPressed(KeyEvent e)
{
gameKeyPressed(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e)
{
gameKeyReleased(e.getKeyCode());
}
@Override
public void keyTyped(KeyEvent e)
{
gameKeyTyped(e.getKeyChar());
}
}
// To start and re-start the game.
public void gameStart()
{
// Create a new thread
Thread gameThread = new Thread()
{
// Override run() to provide the running behavior of this thread.
@Override
public void run()
{
gameLoop();
}
};
// Start the thread. start() calls run(), which in turn calls gameLoop().
gameThread.start();
}
// main
public static void main(String[] args)
{
// Use the event dispatch thread to build the UI for thread-safety.
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new GameMain();
}
});
}
}
最佳答案
由于初始化代码,在初始化期间没有响应是有道理的:
public void dispArray() {
int tempLevel[][] = new int[][] { { 1, 1, 1, 1 }, { 6, 2, 2, 2 },
{ 3, 3, 3, 3 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 },
{ 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 } };
int widthTemp = tempLevel[0].length;
int heightTemp = tempLevel.length;
for (int i = 0; i < heightTemp; i++) {
for (int j = 0; j < widthTemp; j++) {
try {
image = ImageIO.read(getFile());
} catch (Exception e) {
e.printStackTrace();
}
drawB(image);
}
}
}
public File getFile() {
path = "images//1.jpg";
File file = new File(path);
return file;
}
public void drawB(BufferedImage imgTemp) {
image = imgTemp;
repaint();
}
关于Java:repaint() 不在 for 循环中调用paintComponent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027945/
我每秒收到数百个事件,持续几秒钟,每个事件都会更新我的模型。如果我在每个事件之后在 invokeLater() 内部调用 repaint() ,那么 repaint 每秒会被调用数百次吗?它是否足够聪
我在类collection中有一个循环,它repaint() JPanel连续 while(loop) { imageicon = (ImageIcon) ois.readOb
我仍在尝试让一个 repaint() 方法在一个单独的类中工作,该类具有一个扩展 JComponent 的类。我已经在这里发布了几篇文章,但到目前为止我还无法让代码正常工作。我得到了一些很好的建议。我
谁能解释一下JPanel.repaint() 方法和JFrame.repaint() 方法之间的区别,我想两者都调用了paintComponent() JPanel 中的方法。 请说明,谢谢 最佳答案
在repaint(long maxDelay)(来自java.awt.Component)中,maxDelay指定之前可以经过的最大毫秒数调用update。 普通的repaint()有这样的最大值吗?
这个问题是基于我不久前遇到的一个简单的 Swing 骰子程序问题。我发布的原始问题是 here并且有一个可接受的答案,但我想确切地知道发生了什么,为什么会出现问题,以及解决方案为什么有效。 我设法削减
我正在为错误程序编写一个插件,并且在使用 repaint() 方法时遇到问题。 简短的问题:有什么方法可以在 JPanel 重绘完成后立即获得通知或与其同步代码吗? 详细版本: 我的程序可以将 xy
我在java中使用2个类class1和class2,它们都位于不同的包中。 class2 中定义了一个 paintComponent() 和一个 test()。我按以下顺序从 class1 调用这些方
Full project here https://github.com/jafetrd/easyImageEditor 我正在尝试使用paintComponent()将颜色应用于图像,这是我使用的类
我正在尝试制作一个 JFrame 程序,将二进制-十进制-十六进制转换器与按钮连接起来。其中一部分,我想绘制圆圈来表示一排圆圈中的二进制数,其中实心圆圈代表一,空心圆圈代表零。但是,当我尝试调用 re
我两周前才开始学习java,所以我对java还不太了解。我正在尝试让一个球在框架内弹跳或移动。但当我在线程中运行它时,它不会重新绘制/更新,但如果我使用 while 循环或计时器,它就可以正常工作,我
我正在尝试制作一款三消游戏。我试图为实际发生的情况创建一些视觉辅助,首先将需要删除的 gem 标记为“黑色”,然后让重力完成它的工作。我正在努力做到这一点,在将它们标记为“黑色”后,我调用了 repa
我正在编写一个 Java 程序,它将根据按下的按钮绘制圆形或矩形。虽然它确实绘制了给定的形状,但在绘制时它会在窗口的左上角(最有可能是(0,0))创建新按钮。我是否违反了paint()/repaint
我正在为学校项目开发一款游戏,一款类似炸弹人的游戏。 我正在使用 swing,并且使用 Canvas 来绘制图形,但 KeyListener 无法正常工作,因此我退出使用 Canvas 并开始使用 p
嘿,我正在尝试学习如何在java中使用图形,并且正在编写一个非常简单的代码,该代码获取图像并将其在窗口中成一条线移动,当它到达窗口边缘时,它会向下移动几个像素并从另一端开始。 我的问题是我的程序在重新
我试图了解 repaint 和 paintComponents 在 Java Swing 中如何工作,并想知道为什么这个程序在执行时只显示“hello”。 class MyLabel extends
我无法让我的重绘方法在我的 SimonPanel 类中工作。起初,我认为这是因为我使用了paint()而不是paintComponent(),但这似乎并没有解决问题。我的 SimonShape.jav
这就是我的任务。 我必须生成 4 张随机卡。之后,当按下“刷新”按钮时,卡片应再次随机化。我已经像这样实现了 repaint() 方法,但它不会改变卡片的显示方式。 public class Four
我看了很多答案,但仍然找不到解决方案。我有一个 JFrame 和两个 JPanel。我想在按下按钮时删除第一个面板并将其替换为第二个面板,但 repaint() 方法不会刷新框架。请帮忙。 这是我的框
我在这里尝试做的是从我的 loadbg() 方法中调用 repaint() 方法。但是,repaint() 不起作用,并且我的图像(存储在 var bg 中)不会加载到屏幕上。关于为什么这行不通的任何
我是一名优秀的程序员,十分优秀!