2013-03-18 95 views
3

好吧,这看起来像一个非常简单的任务,但我似乎无法得到它。我只想要有一个图像(jpg)作为我的突破游戏的背景。这里是我的代码:在Java Breakout游戏中为JPanel设置背景图像

主类:

import java.awt.BorderLayout; 
import java.awt.Color; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class Breakout extends JFrame { 

    public Breakout() 
    {    
     add(new BreakBoard()); 
     setTitle("Breakout"); 
     setSize(BreakCommons.WIDTH, BreakCommons.HEIGTH); 
     setLocationRelativeTo(null); 
     setIgnoreRepaint(true); 
     setResizable(false); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Breakout(); 
    } 
} 

板类:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class BreakBoard extends JPanel implements BreakCommons { 

    ImageIcon icon = new ImageIcon("../pacpix/love.jpg"); 
    Timer timer; 
    String message = "Game Over"; 
    BreakBall ball; 
    BreakPaddle paddle; 
    BreakBrick bricks[]; 
    boolean ingame = true; 
    int timerId; 


    public BreakBoard() { 
     setOpaque(false); 
     addKeyListener(new TAdapter()); 
     setFocusable(true); 
     //setBackground(Color.white); 
     bricks = new BreakBrick[30]; 
     setDoubleBuffered(true); 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(new ScheduleTask(), 1000, 10); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawImage(icon.getImage(), 10, 10, this); 

     if (ingame) { 
      g.drawImage(ball.getImage(), ball.getX(), ball.getY(), 
         ball.getWidth(), ball.getHeight(), this); 
      g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(), 
         paddle.getWidth(), paddle.getHeight(), this); 

      for (int i = 0; i < 30; i++) { 
       if (!bricks[i].isDestroyed()) 
        g.drawImage(bricks[i].getImage(), bricks[i].getX(), 
           bricks[i].getY(), bricks[i].getWidth(), 
           bricks[i].getHeight(), this); 
      } 
     } else { 

      Font font = new Font("Verdana", Font.BOLD, 18); 
      FontMetrics metr = this.getFontMetrics(font); 

      g.setColor(Color.BLACK); 
      g.setFont(font); 
      g.drawString(message, 
         (BreakCommons.WIDTH - metr.stringWidth(message))/2, 
         BreakCommons.WIDTH/2); 
     } 


     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

所以图像存储在变量icon,位于我的源文件(连同我的班级)所以我知道这条路是对的。我尝试将框架和面板设置为setOpaque(false),但这只是将背景更改为默认灰色。我可以通过setBackground(Color.white);轻松设置背景颜色,但是如何设置图像?

我试着将图像放入JLabel中,然后将其添加到JPanel中,但没有产生任何结果。我将不胜感激任何帮助,并提前致谢!我可以根据需要提供更多信息。

回答

1

这是一个带背景图像的JPanel。在您的代码中使用IPanel代替JPanel。根据需要进行调整以满足您的需求。

public class IPanel extends JPanel { 
private static final long serialVersionUID = 1L; 
private Image    imageOrg   = null; 
private Image    image   = null; 
{ 
    addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentResized(final ComponentEvent e) { 
      final int w = IPanel.this.getWidth(); 
      final int h = IPanel.this.getHeight(); 
      image = w > 0 && h > 0 ? imageOrg.getScaledInstance(w, h, Image.SCALE_SMOOTH) : imageOrg; 
      IPanel.this.repaint(); 
     } 
    }); 
} 

public IPanel(final Image i) { 
    imageOrg = i; 
    image = i; 
} 

@Override 
public void paintComponent(final Graphics g) { 
    super.paintComponent(g); 
    if (image != null) 
     g.drawImage(image, 0, 0, null); 
} 
} 

例子:

final JPanel j = new IPanel(image); 
    j.setLayout(new FlowLayout()); 
    j.add(new JButton("YoYo")); 
    j.add(new JButton("MaMa")); 
    j.add(new JLabel(icon)); 

产地:

enter image description here

+0

能否请您解释一下这个是干什么/它如何适合我的代码? – CodeAddict 2013-03-18 15:27:26

+0

这是一个带背景图像的JPanel。在您的代码中使用IPanel代替JPanel。根据需要调整。 – Java42 2013-03-18 15:30:41

+0

不起作用。即时通讯如此困惑,我会在哪里放?我的代码并没有真正有用的地方,我可以看到。你能解释你的代码的逻辑吗? – CodeAddict 2013-03-18 15:36:33

1

我得到了它的最后工作!

public class BreakBoard extends JPanel implements BreakCommons { 
    Image love; 

    public BreakBoard() { 
     ImageIcon icon = new ImageIcon(this.getClass().getResource("../pacpix/love.jpg")); 
     love = icon.getImage(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(love, 10, 10, null); 
    } 
} 

对于未来的搜索或那些好奇的,我用http://zetcode.com/tutorials/javagamestutorial/basics/。适合初学者的好网站! (或那些需要弱智化下理解)

+0

接受这是正确的解决方案,所以其他人会在搜索时看到它:) – JBuenoJr 2013-07-27 14:41:01

+0

即使它看起来工作 - 重写_paint_在Swing中是错误的方法:相反,覆盖_paintComponent_ – kleopatra 2013-10-17 10:20:59

2

简单的方法首先创建一个单独的类jpane

import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Paint; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 

public class JPanelDemo extends JPanel { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static final Color BACKGROUND  = Color.black; 
    private static final Color BACKGROUND_2 = Color.WHITE; 
    String path="/img/background.jpg"; 

    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D graphics = (Graphics2D) g.create();   
     int midY = 100; 
     Paint topPaint = new GradientPaint(0, 0, BACKGROUND,0, midY, BACKGROUND_2); 
     graphics.setPaint(topPaint); 
     graphics.fillRect(0, 0, getWidth(), midY);   
     Paint bottomPaint = new GradientPaint(0, midY + 1, BACKGROUND_2,0, getHeight(), BACKGROUND); 
     graphics.setPaint(bottomPaint); 
     graphics.fillRect(0, midY, getWidth(), getHeight()); 
     Image img = new ImageIcon(getClass().getResource(path)).getImage(); 
     int imgX = img.getWidth(null); 
     int imgY = img.getHeight(null); 
     graphics.drawImage(img, (getWidth() - imgX)/2, (getHeight() - imgY)/2, imgX, imgY, null); 
     // graphics.dispose(); 
    } 
} 

如何使用它

JPanelDemo contentPane = new JPanelDemo(); 
1
JPanel panel = new JPanel()  
{  
      @Override 
      public void paintComponent(Graphics g) 
      {  
       g.drawImage(ImageObject, 0, 0, null); 
      } 
}; 
+0

与先前的答案相比没什么新意,是吗?也就是说,除了你至少引入了两个错误并使其不那么灵活... – kleopatra 2014-01-20 12:17:00