图像绘制适用于JFrame,但不适用于JPanel

时间:2012-10-25 17:16:15

标签: java image swing jpanel paintcomponent

我正在研究一些简单的应用程序,以熟悉Swing并遇到问题。

我正在尝试使用包含图像的框架(在面板中)以及用于放大/缩小图像的按钮。

我已经能够使添加的图像工作正常(虽然有一些框架大小调整问题,但这是另一个故事),但是,当我调用相同的组件类将其添加到面板时,没有任何东西出现。我希望你们中的一个能够帮助解决这个问题。

CODE:

图像框 - 正如图所示

class ImageFrame extends JFrame{

public ImageFrame(){
    setTitle("Java Image Machine");

    init();
    pack();
}   

public final void init(){
    //ZoomPanel zoomPanel = new ZoomPanel();
    //ImagePanel imagePanel = new ImagePanel();
    ImageComponent component = new ImageComponent();

    //this.add(zoomPanel, BorderLayout.CENTER);
    this.add(component);
    //this.add(imagePanel, BorderLayout.SOUTH);
}
}

但是,使用ImagePanel或同时使用直接ImageComponent调用添加ZoomPanel不会:

class ImagePanel extends JPanel{    
public ImagePanel(){
    //setBorder(BorderFactory.createLineBorder(Color.black));
    ImageComponent component = new ImageComponent();
    add(component);
}   
}

组件类:

class ImageComponent extends JComponent{
public ImageComponent(){

    try{
        image = ImageIO.read(new File("test1.bmp"));
    }
    catch ( IOException e ){
        e.printStackTrace();
    }

    System.out.println("W: " + image.getWidth(this) + " H: " + image.getHeight(this));
}

public void paintComponent( Graphics g ){
    super.paintComponent(g);
    if (image == null)
        return;

    width = image.getWidth(this);
    height = image.getHeight(this);

    //System.out.println("Image should be painted");
    g.drawImage(image, 0, 0, null);
}

private Image image;
public int width;
public int height;

}

2 个答案:

答案 0 :(得分:4)

它适用于我(我刚刚测试了ImageComponent类):

enter image description here

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Test {

    /**
     * Default constructor Test.class
     */
    public Test() {
        initComponents();
    }

    public static void main(String[] args) {

        /**
         * Create GUI and components on Event-Dispatch-Thread
         */
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
            }
        });
    }

    /**
     * Initialize GUI and components (including ActionListeners etc)
     */
    private void initComponents() {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //add ImageComponent to JFrame instance
        jFrame.add(new ImageComponent());

        //pack frame (size JFrame to match preferred sizes of added components and set visible
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

class ImageComponent extends JComponent {

    private Image image;
    public int width;
    public int height;

    public ImageComponent() {
        try {
            image = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png")));
            //image =  ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png"));//uses images scale
        } catch (Exception e) {
            e.printStackTrace();
        }

        //so we can set the JPanel preferred size to the image width and height
        ImageIcon ii = new ImageIcon(image);
        width = ii.getIconWidth();
        height = ii.getIconHeight();
    }

    //so our panel is the same size as image
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

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

        if (image == null) {
            return;
        }

        width = image.getWidth(this);
        height = image.getHeight(this);

        g.drawImage(image, 0, 0, null);
    }
}
//class used for scaling images
class ImageUtils {

    static Image scaleImage(int width, int height, BufferedImage filename) {
        BufferedImage bi;
        try {
            bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(filename, 0, 0, width, height, null);
        } catch (Exception e) {
            return null;
        }
        return bi;
    }
}

问题可能是您文件的路径,或JPanel宽度和高度与图片不同的事实,因此我们覆盖getPrefferedSize(...)的{​​{1}}并返回正确的尺寸根据{{​​1}}

答案 1 :(得分:1)

您是否尝试在添加适当的组件后添加repaint()来电?

class ImagePanel extends JPanel{    
    public ImagePanel(){
        //setBorder(BorderFactory.createLineBorder(Color.black));
        ImageComponent component = new ImageComponent();
        add(component);
        repaint();
    }   
}

同时仔细检查您是否将ImagePanel(包含ImageComponent)添加到ImageFrame,并调用.setVisible(True)。