почему картинка не отображается в разгаре в Java? - PullRequest
3 голосов
/ 09 марта 2012

Я хочу показать изображения на панели Border-layout в центре.Я создаю панель изображений, как показано ниже, а затем добавляю ее в центр Border-layout.Я не знаю, почему изображение не появляется, и нет ошибки тоже.В чем может быть причина и как я могу это исправить?

public class ImagePanel extends WebPanel {
private Image image;
private Image scaledImage;
private int imageWidth = 0;
private int imageHeight = 0;
//constructor
public ImagePanel() {
    super();
}
public void loadImage(String file) throws IOException {
    File filetest= new File("C:\\tmp\\axiuser\\Pictures\\CLA0014.png");
    image = ImageIO.read(filetest);//new File(file)
    imageWidth = image.getWidth(this);
    imageHeight = image.getHeight(this);
    setScaledImage();
}
//e.g., containing frame might call this from formComponentResized
public void scaleImage() {
    setScaledImage();
}
//override paintComponent
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if ( scaledImage != null ) {
        //System.out.println("ImagePanel paintComponent " + ++paintCount);
        g.drawImage(scaledImage, 0, 0, this);
    }
}
private void setScaledImage() {
    if ( image != null ) {
        //use floats so division below won't round
        float iw = imageWidth;
        float ih = imageHeight;
        float pw = this.getWidth();   //panel width
        float ph = this.getHeight();  //panel height
        if ( pw < iw || ph < ih ) {
            if ( (pw / ph) > (iw / ih) ) {
                iw = -1;
                ih = ph;
            } else {
                iw = pw;
                ih = -1;
            }
            //prevent errors if panel is 0 wide or high
            if (iw == 0) {
                iw = -1;
            }
            if (ih == 0) {
                ih = -1;
            }
            scaledImage = image.getScaledInstance(
                        new Float(iw).intValue(), new Float(ih).intValue(), Image.SCALE_DEFAULT);
        } else {
            scaledImage = image;
        }
    }
}

}

Ответы [ 6 ]

1 голос
/ 11 мая 2012

Вы никогда не называете свой метод

public void loadImage (String file) 

SSCCE:

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

public class ImagePanel extends JPanel {
    private Image image;
    private Image scaledImage;

    public void loadImage (String filename) throws IOException {
        image = ImageIO.read (new File (filename)); 
        setScaledImage ();
    }

    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        if ( scaledImage != null) {
            // System.out.println ("ImagePanel paintComponent ");
            g.drawImage (scaledImage, 0, 0, this);
        }
    } 

    private void setScaledImage () {
        if (image != null) {
            //use floats so division below won't round
            int imageWidth = image.getWidth (this);
            int imageHeight = image.getHeight (this);
            float iw = imageWidth;
            float ih = imageHeight;
            float pw = this.getWidth ();   //panel width
            float ph = this.getHeight ();  //panel height
            if ( pw < iw || ph < ih) {
                if ( (pw / ph) > (iw / ih)) {
                    iw = -1;
                    ih = ph;
                } else {
                    iw = pw;
                    ih = -1;
                }
                //prevent errors if panel is 0 wide or high
                if (iw == 0) {
                    iw = -1;
                }
                if (ih == 0) {
                    ih = -1;
                }
                scaledImage = image.getScaledInstance (
                new Float (iw).intValue (), new Float (ih).intValue (), Image.SCALE_DEFAULT);
            } else {
                scaledImage = image;
            }
        }
    }   

    public static void main (String [] args) throws IOException {
        ImagePanel ip = new ImagePanel ();
        ip.loadImage ("./sample.png");
        JFrame jf = new JFrame ();
        jf.setLayout (new BorderLayout ());
        jf.add (ip, BorderLayout.CENTER);
        jf.setSize (400, 400); 
        jf.setLocation (150, 150);
        jf.setVisible (true);
        jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    }
}

Масштабирование пока не работает, но здесь у вас есть с чего начать. (Обратите внимание, что я переименовал изображение).

1 голос
/ 09 марта 2012

Просто переопределите getPreferredSize() вашего JPanel, как вы делаете с помощью метода paintComponent(...). Пусть он возвращает некоторый Dimension объект, что-то вроде:

public Dimension getPreferredSize()
{
    return (new Dimension(300, 300));
}

Это позволит вам увидеть ваши изображения.

0 голосов
/ 09 марта 2012

Рассмотрите возможность использования JLabel для отображения изображений.

JLabel myLabel=new JLabel();
myLabel.setIcon(new ImageIcon("C:\\tmp\\axiuser\\Pictures\\CLA0014.png"));
0 голосов
/ 09 марта 2012

Не зная, когда ваша программа на самом деле вызовет paintComponent(), невозможно сказать. Но если вы вызываете ваш loadImage метод после , вы уже показали GUI (setVisible), вам нужно будет вызвать repaint() или invalidate() на панели, чтобы вызвать перерисовку компонент (и обновите GUI таким образом).

0 голосов
/ 09 марта 2012

Я думаю, вы должны установить панель как непрозрачную:

setOpaque(false)
0 голосов
/ 09 марта 2012

Возможно, для *.png не определено устройство чтения. Вы можете проверить список доступных программ чтения изображений, используя ImageIO.getReaderFormatNames()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...