2014-02-01 2 views
1

Этот код должен отображать фоновое изображение и плеер. Но у него просто розовый рожок. Я не могу понять, откуда эта проблема, вот мой код.ImageIcon Не отображается в java

package main; 

import java.awt.*; 
import javax.swing.ImageIcon;  
import javax.swing.JFrame; 

public class Images extends JFrame { 

    public static void main(String Args[]) { 

     DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); // This is going to take 4 parameter, first 2 is x and y for resolotion. Bit depth, the number of bits in a cloour 
                          // 16 is your bit depth. the last one is the monitor refresh, it means it will refres how much it wants 
     Images i = new Images(); // making an object for this class 
     i.run(dm); // making a run method and is taking the dm as a parameter, in this method we are putting stuff on the screen. 
    } 

    private Screen s; // Creating the Screen, from the Screen.java 
    private Image bg; // Background 
    private Image pic; // Face icon 
    private boolean loaded; // Making the loaded 

    //Run method 
    private void run(DisplayMode dm) { // this is where we do things for the screen 
     setBackground(Color.PINK); // Setting the Background 
     setForeground(Color.WHITE); // Setting the ForeGround 
     setFont(new Font("Arial", Font.PLAIN, 24)); // setting the font 

     s = new Screen(); // now we can call ALL methods from the Screen object 
     try { 
      s.setFullScreen(dm, this); // This is setting the full screen, it takes in 2 parameters, dm is the display mode, so its setting the display settings, the next part is the this, what is just s, the screen object. 
      loadpics(); // calling the loadpics method 
      try { // so if that try block works, then it will put it to sleep for 5 seconds 
       Thread.sleep(5000); // its doing this because, at the bottom (s.restorescreen) this makes it into a window again. so it needs to show it for 5 seconds. 
      } catch (Exception ex) { 
      } 
     } finally { 
      s.restoreScreen(); 
     } 
    } 

    // Loads Pictures 
    private void loadpics() { 
     System.out.println("Loadpics == true"); 
     bg = new ImageIcon("Users/georgebastow/Picture/background.jpg").getImage(); // Gets the background 
     pic = new ImageIcon("Users/georgebastow/Picture/Player.png").getImage(); // Gets the Player 
     System.out.println("Loaded == true in da future!"); 
     loaded = true; // If the pics are loaded then...  
    } 

    public void paint(Graphics g) { 
     if (g instanceof Graphics2D) { // This has to happen, its saying if g is in the class Graphics2D, so if we have the latest version of java, then this will run 
      Graphics2D g2 = (Graphics2D) g; // Were making the Text smooth but we can only do it on a graphcis2D object. 
      g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // we are making the text aniti alias and turning it on!(it means making the text smooths! :)) 
     } 
     if(loaded == true){ 
      System.out.println("Loaded == true3"); 
      g.drawImage(bg,0,0,null); 
      g.drawImage(pic, 170, 180, null); 
      System.out.println("Loaded == true4"); 
     } 
    }  
} 

Заранее большое спасибо

ответ

6

при использовании изображения, вы хотите загрузить их через URL с Class.getResource(), который возвращает URL-адрес. Передача строки ImageIcon приведет к просмотру изображения через файловую систему. Хотя это может работать во время разработки в вашей среде IDE, вы поймете, что он не будет работать во время развертывания. Лучше сделайте изменения сейчас. Чтобы использовать этот метод, вы хотите сделать это

ImageIcon icon = new ImageIcon(Images.class.getResource("/Users/georgebastow/Picture/background.jpg")); 

Для этого, чтобы работать, хотя, вы подаете структура должна выглядеть следующим образом

ProjectRoot 
      src 
      Users 
        georgebastow 
          Picture 
            background.jpg 

более общий подход просто поместить изображение в папку reousrces в ЦСИ

ProjectRoot 
      src 
      resources 
        background.jpg 

И используйте этот путь

ImageIcon icon = new ImageIcon(Images.class.getResource("/resources/background.jpg"));      

Когда вы создадите, ваша среда IDE перенесет изображения в путь к классу.


Side Примечание

  • Не красьте на контейнерах верхнего уровня, как JFrame. Вместо этого используйте JPanel или JComponent и переопределите метод paintComponent. если вы используете JPanel, вы также должны позвонить super.paintComponent в методе paintComponent.
  • Run вы Свинг приложения от Event Dispatch тему как этот

    public static void main(String[] args) { 
        SwingUtiliities.invokeLater(new Runnable(){ 
         public void run() { 
          new Images(); 
         } 
        }); 
    } 
    

    См Initial Thread

  • Не называйте Thread.sleep(). При работе с EDT (как и следовало ожидать) вы заблокируете его. Вместо этого используйте java.swing.Timer, если это анимация, которую вы ищете. Даже если это не анимация, все еще его использовать! См. this example для программы Timer.

  • Также, как отметил @mKorbel, вы никогда ничего не добавляете к кадру.

UPDATE

Выполнить этот пример. Я также забыл упомянуть, когда вы рисуете на JPanel, вы также хотите переопределить getPreferredSize(). Это придаст вашей панели размер.

src/resources/stackoverflow5.png

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestImage { 

    public TestImage() { 
     JFrame frame = new JFrame("Test Image"); 
     frame.add(new NewImagePanel()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public class NewImagePanel extends JPanel { 

     private BufferedImage img; 

     public NewImagePanel() { 
      try { 
       img = ImageIO.read(TestImage.class.getResource("/resources/stackoverflow5.png")); 
      } catch (IOException ex) { 
       System.out.println("Could not load image"); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(600, 600); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestImage(); 
      } 
     }); 
    } 
} 
+0

Привет, я положил background.jpg в папку res, но он попросил меня изменить bg на ImageIcon, а не на изображение. Это означает, что я не могу выполнить g.drawImage (bg, 0,0, null) ;. Я попытался изменить его на drawLine, но это тоже не помогло. – Pilkin

+0

вам нужно использовать .getImage(), как и раньше, в конце экземпляра 'ImageIcon'. Не забудьте сохранить 'bg' как« изображение », которое вы не можете рисовать, и« ImageIcon » –

+0

Я сделал это, когда я запустил программу, она не отображает изображение. Почему это происходит. Он отображает розовый на весь экран. – Pilkin

3
  1. JFrame не является правильным компонентом (его контейнер) для отображения использования Image

  2. из paint() для JFrame не является правильным способом, как отобразить изображение или обычная роспись, графика

  3. JLabel w Ith setIcon() в случае не JFrame используются в качестве контейнера и есть/нет никакого JComponent (ы) в использовании JFrame

  4. JPanel (поставленного на JFrame.CENTER области) с переопределением paintComponent (вместо paint) в так что будет JPanel использован в качестве контейнера для другого JComponent (ов) больше

  5. в Oracle tutorial Working with Images

+0

Спасибо mKorbel, что бы я запускать краски в том, что не JFrame. Как я мог рисовать без JFrame? что бы я использовал вместо – Pilkin

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