每次调整 JFrame 大小时 JPanel 都会刷新
JPanel refreshes everytime the JFrame is resized
每当我在显示屏上移动 window;图文不断刷新
因为有些内容是随机生成然后绘制的,每次刷新都会重新生成并重绘随机生成的部分。
如何让它们只在我需要时才刷新?
在这种情况下,当 monsterHealth
达到 0.
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
public class RPGClicker {
static int attackLevel = 1;
static int defenceLevel = 1;
static int hitpointsLevel = 1;
static int xp = 0;
static int gold = 0;
static int dps = 0;
static int clickDamage = attackLevel;
static int health = hitpointsLevel * 100;
static int healthRecovery = 1;
static int room = 1;
public static void main(String[] args) n{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainGameScene();
}
});
}
public static void mainGameScene() {
JFrame window;
mainGamePanel mainGameInstance;
window = new JFrame("RPGClicker: An Unknown Quest!");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new BorderLayout());
window.setResizable(false);
mainGameInstance = new mainGamePanel();
window.add(mainGameInstance, BorderLayout.CENTER);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.util.*;
class mainGamePanel extends JPanel {
BufferedImage background, user;
public Dimension getPreferredSize() {
return new Dimension(1280, 720);
}
public void paintComponent(Graphics pencil) {
super.paintComponent(pencil);
background = ImageLoader.loadImage("rec/alpha/background0.png");
user = ImageLoader.loadImage("rec/alpha/user.png");
pencil.drawImage(background, 0, 0, null);
pencil.drawImage(user, 100, 450, null);
Monster monster = new Monster();
pencil.drawImage(monster.monsterSprite, 900, 50, null);
pencil.drawString(monster.monsterName, 900, 60);
}
public mainGamePanel() {
}
}
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.util.*;
public class Monster {
static final double BASE_MONSTER_HEALTH = 10;
static double monsterHealth = Math.pow(RPGClicker.room, 2) * BASE_MONSTER_HEALTH;
static double monsterDamage = RPGClicker.room + 1 - RPGClicker.defenceLevel;
BufferedImage monsterSprite;
String monsterName;
Random rand = new Random();
public Monster() {
String monster[] = {"Ork", "Mermaid", "Goblin"};
String monsterType = monster[rand.nextInt(monster.length)];
monsterSprite = ImageLoader.loadImage("rec/alpha/monster/" + monsterType + ".png");
String[] firstName = {"Oliver", "George", "Harry"};
String connection1 = " the ";
String[] secondName = {"Powerful ", "Unstoppable ", "Almighty "};
String connection2 = " of ";
String[] thirdName = {"Death", "America", "Pride"};
monsterName = firstName[rand.nextInt(firstName.length)] + connection1 + secondName[rand.nextInt(secondName.length)] + monsterType + connection2 + thirdName[rand.nextInt(thirdName.length)];
}
}
你让你的绘画方法做得太多了。请理解:
- 一种画法(如
paintComponent
)为画画仅。
- 不要在这些方法中读入图像文件或执行任何其他文件 I/O,因为这会严重减慢渲染速度,使您的 GUI 看起来反应迟钝。当图像只需要并且应该被读取一次时,为什么还要继续重新读取图像。
- 不要在这些方法中放入任何程序逻辑,例如怪物创建,因为您无法完全控制何时甚至是否触发绘画方法。将逻辑和对象创建放在别处。
每当我在显示屏上移动 window;图文不断刷新
因为有些内容是随机生成然后绘制的,每次刷新都会重新生成并重绘随机生成的部分。
如何让它们只在我需要时才刷新?
在这种情况下,当 monsterHealth
达到 0.
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
public class RPGClicker {
static int attackLevel = 1;
static int defenceLevel = 1;
static int hitpointsLevel = 1;
static int xp = 0;
static int gold = 0;
static int dps = 0;
static int clickDamage = attackLevel;
static int health = hitpointsLevel * 100;
static int healthRecovery = 1;
static int room = 1;
public static void main(String[] args) n{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainGameScene();
}
});
}
public static void mainGameScene() {
JFrame window;
mainGamePanel mainGameInstance;
window = new JFrame("RPGClicker: An Unknown Quest!");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new BorderLayout());
window.setResizable(false);
mainGameInstance = new mainGamePanel();
window.add(mainGameInstance, BorderLayout.CENTER);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.util.*;
class mainGamePanel extends JPanel {
BufferedImage background, user;
public Dimension getPreferredSize() {
return new Dimension(1280, 720);
}
public void paintComponent(Graphics pencil) {
super.paintComponent(pencil);
background = ImageLoader.loadImage("rec/alpha/background0.png");
user = ImageLoader.loadImage("rec/alpha/user.png");
pencil.drawImage(background, 0, 0, null);
pencil.drawImage(user, 100, 450, null);
Monster monster = new Monster();
pencil.drawImage(monster.monsterSprite, 900, 50, null);
pencil.drawString(monster.monsterName, 900, 60);
}
public mainGamePanel() {
}
}
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.util.*;
public class Monster {
static final double BASE_MONSTER_HEALTH = 10;
static double monsterHealth = Math.pow(RPGClicker.room, 2) * BASE_MONSTER_HEALTH;
static double monsterDamage = RPGClicker.room + 1 - RPGClicker.defenceLevel;
BufferedImage monsterSprite;
String monsterName;
Random rand = new Random();
public Monster() {
String monster[] = {"Ork", "Mermaid", "Goblin"};
String monsterType = monster[rand.nextInt(monster.length)];
monsterSprite = ImageLoader.loadImage("rec/alpha/monster/" + monsterType + ".png");
String[] firstName = {"Oliver", "George", "Harry"};
String connection1 = " the ";
String[] secondName = {"Powerful ", "Unstoppable ", "Almighty "};
String connection2 = " of ";
String[] thirdName = {"Death", "America", "Pride"};
monsterName = firstName[rand.nextInt(firstName.length)] + connection1 + secondName[rand.nextInt(secondName.length)] + monsterType + connection2 + thirdName[rand.nextInt(thirdName.length)];
}
}
你让你的绘画方法做得太多了。请理解:
- 一种画法(如
paintComponent
)为画画仅。 - 不要在这些方法中读入图像文件或执行任何其他文件 I/O,因为这会严重减慢渲染速度,使您的 GUI 看起来反应迟钝。当图像只需要并且应该被读取一次时,为什么还要继续重新读取图像。
- 不要在这些方法中放入任何程序逻辑,例如怪物创建,因为您无法完全控制何时甚至是否触发绘画方法。将逻辑和对象创建放在别处。