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

时间:2014-03-05 10:01:23

标签: java swing jframe jpanel repaint

互联网的人们!

我一直在为学校制定饮酒游戏计划。

//不是相关信息,仅适用于lulz: //学校建议游戏,我没有;)这是游戏// 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很新,所以不要指望我快速理解复杂的代码:)

谢谢!

1 个答案:

答案 0 :(得分:8)

首先,您忘记在super.paintComponent方法中致电paintComponent。另外,paintComponent应为protected而不是public

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

其次,我认为你不想创建一个新的iconPanel并立即调用它上面的重绘。这可能什么都不做。

而是为setter提供pic,然后在该方法中只有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中初始化一组图像。然后在一个监听器中,你可以改变索引,如果图像数组然后调用重绘。像这样的东西

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