如何从主要访问重绘?

时间:2014-03-11 14:31:20

标签: java swing graphics graphics2d repaint

我正在开发一个Java程序,它基本上从文件源渲染图像,然后将该图像绘制到面板上(在一个框架上)。

现在我能够做的是调用一行代码

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

其中myimage是包含图像的类。

许多人都知道,这只会打印一次图像,如果我调整图像大小,图像就会消失。

现在解决这个问题的方法是将行放入repaint方法,但我现在使用的是main方法,那么如何访问{{1}的定义方法并在repaint方法中更改它?

谢谢!

=============================================== ================================================== ====

我的代码:

主要课程:

main

myimage类:

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

    }

}

3 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解,但如果您想要做的是在窗口内显示带有图像的面板,则应该将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);
    }
}

答案 1 :(得分:1)

  

现在我能做的是调用表单的一行代码   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
    }
}

如果你想改变它,你可以为它设置一个setter

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

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


修改

没有办法绕过它。您需要@Override paintComponent的{​​{1}}方法。调整帧大小时,将自动调用JPanel,将图像保留在那里。应该使用repaint()方法绘制图像。如果要使用paintComponent

中的图像进行实例化,可以让面板构造函数采用Image参数

答案 2 :(得分:1)

  

许多人都知道,这只会打印一次图像,如果我调整图像大小,图像就会消失。

框架调整大小时有什么要求?

  1. 您是否以原始尺寸绘制图像?如果是这样,那么只需使用带有ImageIcon的JLabel并将标签添加到框架
  2. 您希望图像随帧的大小而缩放吗?然后你需要做自定义绘画。您可以创建自定义组件,如其他答案中所示。或者您可以使用带有Stretch Icon的JLabel,它将拉伸以填充标签可用的空间。