如何从主菜单访问重绘?

7vhp5slm  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(339)

我正在开发一个java程序,它基本上是从文件源渲染一个图像,然后将该图像绘制到一个面板(在一个框架上)。
现在我能做的是调用一行

printpanel.getGraphics().drawImage(myimage.globalimage, 0,0, null);

哪里 myimage 是包含图像的类。
很多人都知道,这只会打印一次图像,如果我调整帧的大小,图像就会消失。
现在解决这个问题的方法是把线放到 repaint 方法,但我在 main 方法,那么如何访问 repaint 方法并从 main 方法?
谢谢!

我的代码:
主要类别:

package imagetester;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.*;
import java.awt.Graphics2D.*;
import java.io.*;

public class Imagetester 
{

    public static void main(String[] args) 
    {
        JFrame printframe = new JFrame("The drawing frame");
        JPanel printpanel = new JPanel();
        printframe.setSize(700,700);
        printpanel.setSize(700,700);
        printframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        printframe.add(printpanel);
        printpanel.setVisible(true);
        printframe.setVisible(true);

        Imageobject myimage = new Imageobject();
        try
        {
            myimage.setImage("word.jpg");
        }
        catch(IOException e)
        {
            System.out.println("the image failed!");
        }

        printpanel.getGraphics().drawImage(myimage.globalimage, 0,0, null);
        printpanel.repaint();

        System.out.println("hi");

    }

}

myimage类:

package imagetester;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Imageobject 
{
    BufferedImage globalimage;

    public void setImage(String filename) throws IOException
    {
        globalimage = ImageIO.read(new File(filename));

    }

    public void Imagebject()
    {

    }
}
ddhy6vgd

ddhy6vgd1#

很多人都知道,这只会打印一次图像,如果我调整帧的大小,图像就会消失。
调整框架尺寸时您的要求是什么?
你把图像画成原来的尺寸了吗?如果是这样,那么只需使用带有imageicon的jlabel并将标签添加到框架中
您想让图像与框架的大小成比例吗?那你需要做定制画。您可以创建自定义组件,如其他答案中所示。或者您可以使用带有拉伸图标的jlabel,该图标将拉伸以填充标签可用的空间。

6psbrbz9

6psbrbz92#

我不确定我是否完全理解,但是如果您想在窗口中显示一个带有图像的面板,您应该为jpanel(或任何其他您想要的面板)创建子类,并重写paintcomponent方法来绘制图像。大致如下:

public class ImagePanel extends JPanel {
    private Image image;

    public ImagePanel(Image image) {
        this.image = image;
    }

    @Override
    protected void paintComponent(graphics g) {
        g.drawImage(image, 0, 0, this);
    }
}
shyt4zoc

shyt4zoc3#

现在我能做的是调用一行 printpanel.getGraphics().drawImage(myimage.globalimage, 0,0, null); 不,不要那样做。你的 printPanel 应该已经有了 paintComponent 方法,使用 drawImage 在里面。

Image image;
...
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image != null) {
        g.drawImage(image, ..., this); // this is the ImageObserver. Should not be null
    }
}

如果你想改变的话,你可以给它一个设定器

public void setImage(Image image) {
    this.image = image;
    repaint();
}

只需使用要更改的图像调用该方法

编辑

这是没办法的。你需要 @Override 这个 paintComponent 方法 JPanel . 调整框架大小时, repaint() 将自动调用,将图像保留在那里。图像应绘制在 paintComponent 方法。你可以让面板的构造器 Image 参数,如果您希望以这种方式示例化 ImageObject

相关问题