Java 如果我设置了图像图标和图像,为什么我的程序不使用paintComponent()?
我试图找到类似的问题,但我认为我在这里有一个独特的情况 我正在用java编写一个游戏,我的主类创建了一个框架,其中添加了一个组件类,它是JPanel的扩展。基本上,我画这些椭圆,它们四处移动,做不同的事情,我想在我的一个类中实现一个方法,它将使用图像而不是椭圆。但是,每当我尝试从文件创建和创建图像时,程序都不会运行重写的“paintComponent(Graphics g)”方法 我的主要意见是:Java 如果我设置了图像图标和图像,为什么我的程序不使用paintComponent()?,java,image,swing,netbeans,paintcomponent,Java,Image,Swing,Netbeans,Paintcomponent,我试图找到类似的问题,但我认为我在这里有一个独特的情况 我正在用java编写一个游戏,我的主类创建了一个框架,其中添加了一个组件类,它是JPanel的扩展。基本上,我画这些椭圆,它们四处移动,做不同的事情,我想在我的一个类中实现一个方法,它将使用图像而不是椭圆。但是,每当我尝试从文件创建和创建图像时,程序都不会运行重写的“paintComponent(Graphics g)”方法 我的主要意见是: package mikeengine; import javax.swing.JFrame;
package mikeengine;
import javax.swing.JFrame;
public class MikeEngine {
static final int fx = 1300;
static final int fy = 800;
static final int px = 1292;
static final int py = 767;
static interactivePanel levelPanel;
public static void pause() {
try {
Thread.sleep(10); // wait 10ms
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("MEngine");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(fx, fy);
frame.setResizable(false);
frame.setVisible(true);
levelPanel = new interactivePanel();
addship();
frame.getContentPane().add(levelPanel);
levelPanel.requestFocusInWindow();
while (true) {
pause();
levelPanel.move();
levelPanel.repaint();
}
}
static void addship() {
PlayerShip ship = new PlayerShip(100, 25, 25, px, 0, py, 0);
ship.setGraphic("C:/Users/asdf/Documents/NetBeansProjects/mikeEngine/src/mikeengine/res/right-arrow.jpg");
levelPanel.addObject(ship);
for (int i = 0; i < 5; i++) {
PlayerShip ship2 = new PlayerShip((int) (Math.random() * 1000) + 100, (int) (Math.random() * 1000) + 100, 25, px, px / 2, py, 0);
ship2.setMovement((int) (Math.random() * 10) / 5, (int) (Math.random() * 10) / 2);
levelPanel.addObject(ship2);
}
}
}
interactivePanel类是扩展JPanel的类:
package mikeengine;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JPanel;
public class interactivePanel extends JPanel {
ArrayList<OnScreenObject> objects;
IClick myClick;
Ipress myType;
PlayerShip currentShip;
interactivePanel() {
objects = new ArrayList<>();
myClick = new IClick();
myType = new Ipress();
this.addMouseListener(myClick);
this.addKeyListener(myType);
}
@Override
public void paintComponent(Graphics g) {
System.out.println("painting");
paintBackground(g);
paintObjects(g);
checkClick();
checkPress();
}
public void move() {
System.out.println("here2");
checkDeadShip();//also sets current ship
moveObjects();//also removes invisible
checkCollisions();
} // end method move
private void checkClick() {
if (!myClick.getClicked()) {
return;
}
for (int i = 0; i < objects.size(); i++) {
OnScreenObject current = objects.get(i);
if (current.isWithin(myClick.getX(), myClick.getY())) {
System.out.println("CLICKED");
}
}
}
private void paintBackground(Graphics g) {
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
}
private void paintObjects(Graphics g) {
for (int i = 0; i < objects.size(); i++) {
OnScreenObject current = objects.get(i);
g.setColor(current.getColor());
g.fillOval(current.getXMin(), current.getYMin(), current.getXSize(), current.getYSize());
}
}
public void addObject(OnScreenObject toAdd) {
objects.add(toAdd);
}
private void checkPress() {
if (myType.getDown()) {
objects.get(0).nudge(false, 3);
}
if (myType.getUp()) {
objects.get(0).nudge(false, -3);
}
if (myType.getLeft()) {
objects.get(0).nudge(true, -3);
}
if (myType.getRight()) {
objects.get(0).nudge(true, 3);
}
if (myType.getSpace()) {
fire();
}
}
private void fire() {
OnScreenObject shotBullet = new Bullet(currentShip.getXMax(), ((currentShip.getYMax() - currentShip.getYMin()) / 2) + currentShip.getYMin(), 5, getWidth(), 0, getHeight(), 0);
int shipBonus = 0;
if (currentShip.getRun() > 0) {
shipBonus = currentShip.getRun();
}
shotBullet.setMovement(0, shipBonus + 5);
addObject(shotBullet);
}
private void checkCollisions() {
for (int i = 0; i < objects.size() - 1; i++) {
for (int j = 0; j < objects.size(); j++) {
if (j != i) {
OnScreenObject current = objects.get(i);
OnScreenObject next = objects.get(j);
if (current.checkCollide(next)) {
objects.remove(i);
if (i < j) {
objects.remove(j - 1);
} else {
objects.remove(j);
}
}
}
}
}
}
private void checkDeadShip() {
if (objects.size() > 0) {
try {
currentShip = (PlayerShip) objects.get(0);
} catch (Exception e) {
System.out.println("GAME OVER!");
}
}
}
private void moveObjects() {
for (int i = 0; i < objects.size(); i++) {
OnScreenObject current = objects.get(i);
current.move();
if (!current.getVisible()) {
objects.remove(i);
}
}
}
}
package-mikeengine;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.util.ArrayList;
导入javax.swing.JPanel;
公共类interactivePanel扩展了JPanel{
阵列列表对象;
IClick-myClick;
i型;
演员资格;
interactivePanel(){
objects=newarraylist();
myClick=新建IClick();
myType=新的Ipress();
这个.addMouseListener(myClick);
this.addKeyListener(myType);
}
@凌驾
公共组件(图形g){
系统输出打印(“绘制”);
背景(g);
颜料(g);
选中click();
checkPress();
}
公开作废动议(){
System.out.println(“此处2”);
checkDeadShip();//还设置当前装运
moveObjects();//还删除不可见对象
检查碰撞();
}//结束方法移动
私有void checkClick(){
如果(!myClick.getClicked()){
返回;
}
对于(int i=0;i0){
shipponus=currentShip.getRun();
}
散弹射击。设定移动(0,舰载+5);
addObject(散弹);
}
私有void checkCollisions(){
对于(int i=0;i0){
试一试{
currentShip=(PlayerShip)objects.get(0);
}捕获(例外e){
System.out.println(“游戏结束!”);
}
}
}
私有void moveObjects(){
对于(int i=0;i
如果我没有注释掉该行,则
System.out.println(“绘制”)我的public void paintComponent(Graphics g)
内部的code>从未运行过,这就是我假设paintComponent没有运行的原因。
(我无法发布图像,因为我没有10个rep,但它只是一个带有米色空白面板外观的JFrame,没有注释)。编辑:
在setGraphic()方法中,替换行
graphic = new ImageIcon("setto");
为此:
graphic = new ImageIcon(this.getClass()
.getResource(setto));
你不应该删除所有的代码,而应该发布“你真的不需要看到游戏玩家的代码,它只会覆盖一个不相关的方法……”
——除非你知道问题的根源,否则不应该做出任何假设。是的,我同意@Pshemo:您需要做一些工作,通过创建一个新程序来隔离问题,该程序借用了您当前的代码,但只有足够的代码来编译、运行并向我们展示您的问题。@Pshemo我没有转储所有的代码,我省略了6个类。我不明白这些类中是什么导致了这个程序,所以我不知道应该忽略哪些部分。@HoverCraftFullOfels Playership只覆盖CheckEdge()方法,该方法与视觉效果无关。它只是通过将对象的上升和运行设置为不同的数字来改变对象到达边界时的行为。可能的原因是您正在阻塞EDT。好的建议是,如果从未调用paintCompment,它可能不会有帮助。。。。马上就行了!非常感谢!明亮的很高兴听到这个消息+1谢谢。(不幸的是,我不能否决你的解决方案,所以你必须接受支票)。我在最初发布代码时错误地引用了我的代码,并且在setto周围没有引号。(我已经从参数改为绝对路径并返回,忘记删除引号)。它不起作用。
graphic = new ImageIcon(this.getClass()
.getResource(setto));