2015-06-01 2 views
1

где проблема. Он не показывает изображение должным образом.ImageIcon отображается как небольшой квадрат

default.png = a busy cat *********

, что я вижу = a busy cat *********

Я не думаю, что есть проблема с png. Это также в моем src, и я обновил его на затмении.

коды:

import java.awt.*; 

import javax.swing.*; 

public class Main { 

public static void main(String[] args) { 


    JFrame jf = new JFrame(); 

    jf.setTitle("test"); 
    jf.setLayout(new FlowLayout()); 
    jf.setSize(350, 450); 
    jf.setVisible(true); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    jf.add(new Panel()); 

} 

} 

панель:

import java.awt.Graphics; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 


public class Panel extends JPanel { 

// PROPERTIES 

public ImageIcon icon; 

// CONSTRUCTORS 

public Panel() { 

    icon = new ImageIcon(this.getClass().getResource("default.png")); 
} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.drawImage(icon.getImage(), 0, 0, null); 

} 


} 
+0

переименовывать 'Panel' класс' CustomPanel' –

+0

он не работает :( –

+0

ли вы изменить его в 'новый CustomPanel()'? –

ответ

1

Этот ответ адресует свою критику ответа на OP , Пример включает советы, добавленные в различные комментарии.

enter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.border.LineBorder; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     URL url = new URL("http://i.imgur.com/o0E0aGD.png"); 
     BufferedImage bi = ImageIO.read(url); 
     JFrame jf = new JFrame(); 

     jf.setTitle("test"); 
     jf.setLayout(new FlowLayout()); 
     //jf.setSize(350, 450); just pack() 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     jf.add(new BackgroundImagePanel(bi)); 

     jf.pack(); 
     jf.setMinimumSize(jf.getSize()); 
     jf.setVisible(true); 
    } 
} 

class BackgroundImagePanel extends JPanel { 

    public Image img; 

    // CONSTRUCTOR 
    public BackgroundImagePanel(Image img) { 
     this.img = img; 
     this.setBorder(new LineBorder(Color.RED, 2)); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(img, 0, 0, this); 
     // g.drawImage(img, 0, 0, getWidth(), getHeight(), this); // Better! 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension d = super.getPreferredSize(); 
     int w = d.width>img.getWidth(this) ? d.width : img.getWidth(this); 
     int h = d.height>img.getHeight(this) ? d.height : img.getHeight(this); 

     return new Dimension(w, h); 
    } 
} 
0

Я решил эту проблему, добавив в панели конструктора класса:

setPreferredSize(new Dimension(500, 500)); 
+1

, вероятно, установил размер звонков g.repaint, которого вы не сделали. вы могли бы проверить, будет ли g.repaint() после g.drawImage() работать? – zubergu

+1

См. [Следует избегать использования методов метода Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) Правильный подход в этом случае для '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Затем, добавив его и все остальные компоненты в фрейм, вызовите 'pack()' в фрейм, и это будет точный размер. –

+1

.. или, как было предложено @StanislavL, если не добавлять какие-либо другие графические элементы, краски или компоненты в дополнение к изображению, просто полностью отбросьте пользовательский компонент и покажите изображение в 'JLabel'. –

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