2016-11-16 4 views
1

У меня возникли проблемы с получением изображения для показа на JFrame. Рамка полностью белая. Вот мой код:Java - BufferedImage не отображается на JFrame

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     try { 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 


    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawImage(test, 200, 200, null); 
    } 
} 

Я не уверен, что я делаю что-то не так. У меня нет ошибок при запуске.

Заранее благодарен!

+0

Как запустить свой код? –

+0

Вы можете вызвать setIcon() в JLabel и поместить эту метку на кадр. – Chains

+0

Попробуйте нарисовать 'JPanel' внутри' JFrame', переопределив метод paintComponent', а не непосредственно в фрейме. –

ответ

0

Вы можете попробовать, используя этот код. вам нужно загрузить JLabel на Jframe при добавлении изображения.

BufferedImage test = null; 

public static void main(String[] args) throws URISyntaxException { 
    new JFrameTesting(); 
} 
public JFrameTesting() throws URISyntaxException { 
    JFrame frame = new JFrame("My first JFrame!"); 
    JLabel label = new JLabel(); 
    frame.setSize(800, 800); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    try { 
     test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
     frame.add(new JLabel(new ImageIcon(test)),BorderLayout.CENTER); 
     frame.setIconImage(test); 
     frame.setVisible(true); 
     label.setVisible(true); 
    } catch (IOException ex) { 
     Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 


public void paint(Graphics g) { 
    super.paint(g); 
    g.drawImage(test, 200, 200, null); 
} 

}

+0

вам нужно загрузить JLabel на Jframe при добавлении изображения. – dunknisai

+0

Работал отлично! Огромное спасибо. – JKode

0

Вы еще не добавили свое изображение в JFrame. Чтобы изображение появилось, вам нужно добавить BufferedImage на компонент, а затем нарисовать его. Вы можете сделать это с помощью JLabel и ImageIcon.

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 
    ImageIcon image = new ImageIcon(); 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     try { 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
      image.setImage(test); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     JLabel label = new JLabel(); 
     label.setIcon(image); 
     frame.add(label); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

}

В качестве альтернативы вы можете пропустить метку и рисовать на компоненте, если вы хотите. В этом случае вам придется переопределить метод draw JPanel.

JPanel pane = new JPanel() { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 200, 200, null); 
     } 
    }; 
frame.add(pane); 

Еще одно замечание, что вы расширяете JFrame, но и делает новый JFrame внутри класса. Вы можете удалить дополнительный JFrame и весь «фрейм». Сам класс является JFrame, поэтому вам не нужен дополнительный.

//set the title using the setTitle method 
setTitle("My first JFrame!"); 

add(label); 
setSize(400, 400); 
setVisible(true); 
setLocationRelativeTo(null); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 

Кроме того, я считаю, что метод ImageIO.read (...) может принять URI в качестве параметра, так что вы не должны создать файл из него.

+0

«У вас нет на самом деле добавил ваш образ в JFrame еще. ": О, да? и весь drawImage, что он там делает? это пух, который вы добавляете здесь. – gpasch

+0

Изображение должно быть добавлено к компоненту, который будет перемещаться по JFrame, а не прямо на JFrame. В моем ответе я указываю, что переопределение метода paintComponent JPanel будет работать как альтернатива. – Brion

0

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

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     try { 
      System.out.println("init"); 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
      System.out.println(test); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     final JPanel pane = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       System.out.println("paint"); 
       super.paintComponent(g); 
       g.drawImage(test, 0, 0, null); 
      } 
     }; 
     frame.add(pane); 
     frame.repaint(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     System.out.println("paint"); 
     g.drawImage(test, 200, 200, null); 
    } 
}