繁体   English   中英

如何在不使用新 JFrame 的情况下更改 JPanel 中的图像(Repaint() 不起作用!)

[英]How to change image in JPanel without using a new JFrame (Repaint() doesn't work! )

我一直在为学校设计一个喝酒游戏程序。

//这是游戏 //http://sotallytober.com/games/verbal/mexican/

无论如何,我使用以下代码在 JPanel 中绘制了一个图像(它是一个扩展 JPanel 的类)

public class iconPanel extends JPanel {

ImageIcon image;
Image pic;
public iconPanel(String startScreenImage) {
      image = new ImageIcon(startScreenImage);
      pic = image.getImage();
      this.setBackground(new Color(0, true));
}

@Override

public void paintComponent(Graphics g) {
    //Paint background first
    g.drawImage (pic, 0, 0, getWidth (), getHeight (), this);
}

现在在我的另一个班级中,我在我的 JPanels 顶部声明了布局和所有组件,如下所示:

private JPanel pnDrinkPlayerBW;

然后在名为 MakeComponents 的同一个类中的方法中,我将 JPanel 设置为:

pnDrinkPlayerBW = new iconPanel("img/glass.jpg");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));

之后我将它添加到它必须出现的面板中,并在方法 makeLayout() 中将该面板添加到框架上(我认为它不是有用的代码,所以如果你想看它,问我)

然后,如果按下按钮,我想将 glass.jpg 图像更改为另一个图像,例如 beerGlass0.png,因此在另一个方法 actionEvents() 的 actionlistener 中,我这样做:

pnDrinkPlayerBW = new iconPanel("img/beerGlass.png");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));
pnDrinkPlayerBW.repaint();

我会把这个类的构造函数也放在这里,如果人们需要它:

public SpelScreen(){
    makeComponents();
    makeLayout();
    actionEvents();
} // note : this is'nt the full constructor, just the call for the methods I talked          about, SpelScreen extends JFrame..

所以我想要做的是在类 SpelScreen 中为 iconPanel 设置一个新图像,并使用相同的 spelscreen 实例重新绘制它。

我对 Java 很陌生,所以不要指望我能快速理解复杂的代码 :)

谢谢!

首先,您忘记在您的paintComponent方法中调用super.paintComponent 也应该protected paintComponent而不是public

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(..);
} 

其次,我认为您不想创建一个新的iconPanel并立即对其调用 repaint。 那可能什么也做不了。

取而代之的是为您的pic setter一个setter ,然后只需repaint(); 在那个方法里面。

public void setPic(Image pic) {
    this.pic = pic;
    repaint();
}

然后,你可以调用setPic从您创建的类iconPanel英寸例如

iconPanel panel = new iconPanel("...");
... // then in some listener
public void actionPerformed(ActionEvent e) {
    Image pic = null;
    try {
        pic = ImageIO.read(...);
        panel.setPic(pic);
    } catch ...
}

另一种选择是在iconPanel初始化一组图像。 然后在 aa 侦听器中,您可以更改索引,如果图像数组然后调用重绘。 像这样的东西

Image[] images = new Image[5];
int imageIndex = 0;
// fill the array with images

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(images[imageIndex], ...);
}

然后你可以改变imageIndexrepaint()


边注

您应该使用 Java 命名约定。 类名使用大写字母,即iconPanelIconPanel


更新

使用ImageIcon

public void setImage(ImageIcon img) {
    pic = img.getImage();
    repaint();
}

暂无
暂无

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

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