2014-01-17 2 views
1

У меня возникли проблемы с покраской изображения в моей GraphicsPanel (расширение JPanel). Я попробовал загрузку из файла с именем пути, используя getCodeBase(), getDocumentBase(), getResource() и используя BufferedImage. Есть ли способ рисовать изображение, не делая его ImageIcon внутри JLabel?Невозможно нарисовать изображение в моем JPanel

package rpg; 

import java.awt.Color; 

import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JPanel; 
import java.awt.Image; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import java.awt.image.BufferedImage; 

public class GraphicsPanel extends JPanel implements MouseListener, MouseMotionListener { 
private WorldBuilder wb; 
public int currentTileType = 0;//tile types. 0=bgtile, 1=object, 2=NPC 
public String currentTileName = ""; 
public Image currentTile; 

public GraphicsPanel() { 
    super(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.fillRect(0, 0, 720, 528); 
    g.drawImage(currentTile, 100, 100, this);//Nothing gets drawn here 
} 

public void getParameters(WorldBuilder wb) { 
    this.wb = wb; 
    this.currentTileType = wb.currentTileType; 
    this.currentTileName = wb.currentTileName; 
    /* 
    try { 
     currentTile = ImageIO.read(new File("SpriteSheet.png")); 
    } catch (IOException e) { 
     System.out.println("failed"); 
    } 
    */ 
    currentTile = new ImageIcon("SpriteSheet.png").getImage(); 
    repaint(); 
} 

@Override 
public void mouseClicked(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mousePressed(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mouseEntered(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mouseExited(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void mouseMoved(MouseEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

}

+0

Картины на '100x100' может быть картины за пределами видимого диапазона компонента. 'ImageIcon (String)' ожидает, что 'String' является ссылкой на файл, поэтому изображение является встроенным ресурсом, изображение не будет найдено. Попробуйте использовать 'ImageIO.read' вместо этого, поскольку он по крайней мере выбросит' IOException', когда что-то пойдет не так ... – MadProgrammer

+0

Компонент имеет размеры 720x528. Раньше я использовал ImageIO.read, но это тоже не сработало. На данный момент я просто поместил файл изображения в тот же каталог, что и файл java, чтобы проверить его, так как чтение прямо из ссылки на файл должно работать именно так. – ixin

+0

Прежде всего, вы не предоставили достаточно информации, чтобы сделать «предположение» о размере компонента. Во-вторых, если файл изображения находится в том же «пакете», что и файл класса («rpg'), то путь к файлу неверен, из контекста приложения он будет больше похож на« rpg/SpriteSheet.png ». Вы можете сделать 'System.out.println (новый файл (« SpriteSheet.png »). Exists());', чтобы проверить его, он скорее всего напечатает 'false'. Если «SpriteSheet.png» находится в контексте приложения, попробуйте использовать «ImageIO.read» (getClass(). GetResource («SpriteSheet.png»)). – MadProgrammer

ответ

0

Следующие работы для меня. Я взял ваш код и добавил панель в JFrame. Кроме того, я вызываю getParameters(); перед добавлением панели в JFrame.

import java.awt.Color; 

import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JPanel; 
import java.awt.Image; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import java.awt.image.BufferedImage; 

public class GraphicsPanel extends JPanel implements MouseListener, 
     MouseMotionListener { 

    public static void main(String args[]) { 
     GraphicsPanel s = new GraphicsPanel(); 
     s.getParameters(); 
     JFrame frame = new JFrame(); 
     frame.add(s);  
     frame.setVisible(true);  
    } 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public int currentTileType = 0;//tile types. 0=bgtile, 1=object, 2=NPC 
    public String currentTileName = ""; 
    public Image currentTile; 

    public GraphicsPanel() { 
     super(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(currentTile, 100, 100, this);//Nothing gets drawn here 
    } 

    public void getParameters() { 
     currentTile = new ImageIcon("test.jpg").getImage(); 
     repaint(); 
    } 

    @Override 
    public void mouseDragged(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseMoved(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

Я реализую это расширение JPanel внутри класса, расширяющего JFrame. Я думаю, что проблема связана с моим именем пути к моему файлу. – ixin

+0

Попробуйте запустить приложение в качестве администратора. Кроме того, попробуйте поместить файл изображения в проект eclipse и получить доступ только с именем файла. –

1

Резюме комментариев:

  • SpriteSheet.png не находится в месте, ImageIcon(String) сможет его найти. ImageIcon(String) ожидает, что String ссылается на File на файловую систему, но SpriteSheet.png хранится в контексте приложения (src/rpg/SpriteSheet.png), что делает его встроенным ресурсом.
  • Используйте Class#getResource для загрузки встроенных ресурсов, в этом случае getClass().getResource("SpriteSheet.png") или getClass().getResource("/rpg/SpriteSheet.png") для гарантии.
  • ImageIO.read более ImageIcon. По крайней мере, он вытащит IOException, когда изображение не может быть загружено по какой-либо причине, где ImageIcon может выйти из строя тихо.
  • Убедитесь, что экземпляр GraphicsPanel который загружает ресурсы тот же экземпляр, который находится на экране
+0

@ixin Я добавил этот ответ в виде краткого изложения пунктов, которые, как я думаю, мы рассмотрели в нашем «разговоре», могли бы просмотреть их и убедиться, что я рассмотрел основные моменты. ура – MadProgrammer

Смежные вопросы