简体   繁体   English

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

[英]Image Drawing Works for JFrame, But Not JPanel

I'm working through some simple applications to get familiar with Swing and running into problems. 我正在通过一些简单的应用程序来熟悉Swing并遇到问题。

I'm attempting to have a frame containing an image (in a panel) along with buttons to zoom in/out from the image. 我正在尝试一个包含图像的面板(在面板中)以及用于放大/缩小图像的按钮。

I have been able to make a frame with the added image work fine (albeit with some frame sizing issues, but that is another story), however, when I call the same component class to add it to a panel, nothing appears. 我已经能够使添加了图像的框架正常工作(尽管存在一些框架大小问题,但这是另一个故事),但是,当我调用相同的组件类将其添加到面板中时,什么也没出现。 I'm hoping one of you can help shed light on the situation. 我希望你们中的一员可以帮助您了解情况。

CODE: 码:

Image Frame - Is working as shown 镜框-如图所示工作

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);
}
}

However, using the ImagePanel or adding the ZoomPanel simultaneously with the direct ImageComponent call, does not: 但是,在直接调用ImageComponent的同时使用ImagePanel或添加ZoomPanel不会:

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

Component class: 组件类:

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;

} }

It works fine for me ( I just tested the ImageComponent class): 它对我来说很好(我刚刚测试了ImageComponent类):

在此处输入图片说明

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;
    }
}

problem might be the path to your file, or the fact that JPanel width and height will not be the same as the pictures thus we override getPrefferedSize(...) of JPanel and return correct size according to Image 问题可能是文件的路径,或者JPanel宽度和高度与图片不同,因此我们重写了JPanel getPrefferedSize(...) ,并根据Image返回正确的大小。

Have you tried adding repaint() calls after adding the appropriate components in? 在添加适当的组件之后,您是否尝试过添加repaint()调用?

ie

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

Also double check that you are adding the ImagePanel (containing the ImageComponent) to the ImageFrame, and calling .setVisible(True). 还要仔细检查您是否正在将ImagePanel(包含ImageComponent)添加到ImageFrame,并调用.setVisible(True)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM