在油漆面板中更改绘制的图像

时间:2014-01-20 16:07:02

标签: java swing paintcomponent drawimage

我正在尝试通过将新图像目录发送到我的绘图面板然后将Image变量更改为该图像来更改正在绘制的图像。我已经测试了代码以确保目录正在通过,但图像永远不会改变。他们似乎忽略了新的图像并继续绘制前一个图像。我为这些凌乱的代码道歉,但我一直在调整这个问题几个小时,试图让图像改变,让我感到沮丧。

public class painting extends JPanel {
    private String BGDir;
    private String Dir;
    private int Width;
    private int Height;
    private Image image1;
    private Image image2;

    public painting(int h, int w, String BG, String Char) {
        BGDir = BG;
        Dir = Char;
        Height = h;
        Width = w;
        System.out.println(BGDir);
        System.out.println(Dir);
        try {
            image1 = (new ImageIcon(Char)).getImage();
            image2 = (new ImageIcon(BG)).getImage();
        } catch (Exception e) {
            System.out.println("no such file");
        }
        repaint();
    }

    public void update(Graphics g) {
        paintComponent(g);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        System.out.println(BGDir);
        System.out.println(Dir);
        // PAINTS THE BACKGROUND
        g2.drawImage(image2, 0, 0, getWidth(), (int) (getWidth() * .533), null);
        // PAINTS THE SCALED CHARACTER
        g2.drawImage(image1, (int) (Width / 6.22), (int) (Height * .246),
                (int) (Height * .754 * .2376), (int) (Height * .754), null);
        repaint();

    }
}

2 个答案:

答案 0 :(得分:0)

在此面板实例化一次后,您无法通过构造函数参数更改图像。您只能创建此面板的新实例(使用新URL),然后使用新实例替换旧实例。您应该显示创建此窗格的第一个实例的代码,以及显示如何尝试更新图像的代码。

答案 1 :(得分:0)

我使用BufferedImage,但这是来自我的工作代码的示例。

public class PaintPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    BufferedImage icon;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(getBufferedIcon(), 12, 12, null);
    }

    public void setBufferedIcon(BufferedImage icon) {
        this.icon = icon;
    }

    private BufferedImage getBufferedIcon() {
        return icon;
    }
}

忽略12的偏移,这只是因为我从我的一个项目中撕掉了这个。我在另一个课程中所做的就是创建PaintPanel并设置BufferedIcon

每次我想更新图标时,都会调用PaintPanel.setBufferedIcon(icon);然后PaintPanel.repaint();

请记住命名 PaintPanel,我只是调用它,以便您可以更轻松地阅读代码:)