2015-11-05 3 views
-1

Так что я пытаюсь нарисовать изображение на JFrame, и я использую defualt toolkit как наблюдатель изображения, но каждый раз, когда я запускаю проект, он не рисует изображение, однако оно будет рисовать и перемещать (успешно) другие формы, которые я тестирую.Image wont draw in Java

private class Painter extends JPanel implements ImageObserver { 

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Toolkit tk = Toolkit.getDefaultToolkit(); 
    Image player = tk.createImage("player.jpg"); 
    tk.prepareImage(player, 50, 50, rootPane);   
    g.setColor(Color.red); 
    // g.drawRect(x, y, 50, 50); 
    g.drawImage(player, 200, 200, this); 
    window.repaint();    
    } 
} 
+0

Где находится изображение? createImage будет искать файл в файловой системе с именем «player.jpg» в текущем рабочем каталоге – MadProgrammer

+0

Изображение находится внутри той же папки, что и пакет – Tristan

+0

Предполагая, что вы имеете в виду, что изображение находится в том же пакете, что и класс или его внутри источника напрямую, то есть ваша проблема. Вам нужно использовать 'Class # getResource' для получения URL-адреса ресурса, из которого вы можете загрузить изображение. Вы можете использовать 'ImageIO.read (getClass(). GetResource (" player.jpg "))', чтобы загрузить изображение, но уже было указано, вы не должны делать это из метода рисования – MadProgrammer

ответ

0

Последний код выглядит так для всех, кто интересуется. Слушатель действия не был включен ранее, потому что это в основном не касалось вопроса. Причина, по которой был включен последний фрагмент, публичная картина, заключалась в том, что прослушиватель действий не мог быть вызван из статического основного метода. Этот подкласс был изначально тем, что содержал все окна. * Lines, но вызывал бесконечное количество созданных окон, поэтому, когда он был перемещен в основное место, новый вызов рисования должен был быть заключен в управляемый цикл и внешний из основного метода. Speical Спасибо всем, кто помог мне с этим, особенно Gilbert Le Blanc

package painting; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.*; 
import java.io.*; 
import javax.imageio.ImageIO; 


/** 
* 
* @author tt700 
*/ 
public class Painting extends JPanel { 
    // declaring variables that control movement, show the frame, and make the picture 
    int x =50, y =50, counter = 0; 
    private static JFrame window = new JFrame("Paint a Picture"); 
    private static Painting canvas; 
    private static Image player; 


// main method 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable(){ 
    @Override 
    public void run(){  
    JLabel title = new JLabel("Making a picture frame"); 
    window.add(title, BorderLayout.NORTH); 
    canvas = new Painting(); 
    window.add(canvas); 
    player = getImage("player.jpg"); 
    window.setVisible(true); 
    window.setSize(300,300); 
    window.setForeground(Color.red); 

    } 
    }); 
} 

@Override 
// the method that does all the painting 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(player, x, y, Painting.this); 
} 

// the method that gets a desired image and makes it displayable, with arguments it can be used to swap pictures easily 
private static Image getImage(String imagePath){ 
    Image player = null; 
try{ 
    player = ImageIO.read(Painting.class.getResource(imagePath)); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     return player; 
} 
// the class that controls movement of the picture 
public class movement implements KeyListener{ 

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

    @Override 
    // the method that listens to which keys are pressed and acts accordingly 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT){     
     x += 5;     
     window.repaint(); 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_LEFT){ 
     x -= 5; 
     window.repaint(); 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_UP){ 
     y -= 5; 
     window.repaint(); 
    } 
    else if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
     y += 5; 
     window.repaint(); 
    } 
    } 

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

// the subclass that adds a key listener to the proper component, created since action listeners can't be called in static methods (main) 
public Painting(){ 
    do{ 
    counter = 1; 
    window.addKeyListener(new movement()); 
    }while(counter < 1); 
} 

}

2
  1. Не делать ввода/вывода в методе окраски. Методы живописи предназначены только для рисования.
  2. Не вызывайте repaint() в методе рисования. Это вызовет бесконечный цикл.

Прочитайте изображение в переменной вашего класса в конструкторе вашего класса с помощью ImageIO, чтобы изображение было доступно, когда пришло время рисовать изображение. ImageIO будет генерировать сообщение, если изображение не будет найдено.

3

Ваш метод paintComponent не должен делать ничего, кроме краски.

@Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.red); 
     // g.drawRect(x, y, 50, 50); 
     g.drawImage(player, 200, 200, this); 
    } 

Инструментарий и линии изображения должны быть в конструкторе Painter. Названия классов должны начинаться с заглавной буквы.

Редактировать на основе комментария:

Вы пишете код, который выглядит следующим образом:

private Image player; 

public Painter() throws Exception { 
    player = ImageIO.read(getClass().getResource("player.jpg")); 
} 

player.jpg должна находиться в том же каталоге, что и исходный код. В противном случае ваш каталог изображений должен находиться в пути к классам вашего Java-приложения.

Вот полное, простое приложение Swing для рисования изображения на JPanel.

package com.ggl.testing; 

import java.awt.Graphics; 
import java.awt.Image; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class MyPanel extends JPanel { 

    private static final long serialVersionUID = -9008812738915944216L; 

    private static JFrame frame; 
    private static MyPanel panel; 
    private static Image image; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       image = getImage(); 
       frame = new JFrame(); 
       panel = new MyPanel(); 
       frame.setSize(500, 500); 
       frame.add(panel); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 100, 100, MyPanel.this); 
    } 

    private static Image getImage() { 
     Image image = null; 
     try { 
      image = ImageIO.read(MyPanel.class.getResource("maze.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return image; 
    } 
} 

Изменить maze.jpg на свое изображение и поместить изображение в ту же директорию, что и этот примерный код.

+0

Не могли бы вы подробнее рассказать о создании набора инструментов и изображений в конструкторе? – Tristan

+0

@Tristan: Я изменил свой ответ. –