2013-03-18 2 views
3

Хорошо, это похоже на очень простую задачу, но я не могу ее получить. Все, что я хочу, это иметь изображение (jpg) в качестве фона для моей прорывной игры. Вот мой код:Установить фоновое изображение для JPanel в Java Breakout Game

Главный класс:

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

Board Класс:

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

+0

Это JPanel с фоновым изображением. Используйте IPanel вместо JPanel в коде. При необходимости измените настройки. – Java42

+0

это не работает. и я так смущен, где бы я это сказал? Мой код на самом деле не имеет места для этого, что я могу видеть. Не могли бы вы объяснить логику вашего кода? – CodeAddict

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/. Отличный сайт для новичков! (Или те, которые нужно dumbing вниз, чтобы понять)

+0

Примите это как правильное решение, так что другие будут видеть его при поиске :) – JBuenoJr

+0

, даже если он работает - переопределение _paint_ - неправильный подход в Swing: вместо этого переопределить _paintComponent_ – kleopatra

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

Смежные вопросы