2013-11-27 3 views
0

У меня есть небольшая проблема с рисованием некоторых изображений. Я использую JDialog для отображения фона и выделенного класса для отображения карт (используя спрайты).Компонент краски над фоном

Фон хорошо отображен, но JPanel нет.

Вот мой код:

public Main(java.awt.Frame parent, boolean modal) { 
    super(parent, modal); 
    initComponents(); 

    //Call the board to draw cards 
    Board plateau = new Board(); 

    this.add(plateau); 
} 

/** 
* Paint the background 
* 
* @param g 
*/ 
@Override 
public void paint(Graphics g) { 
    try {  
     Graphics2D g2 = (Graphics2D) g; 

     this.background_image = ImageIO.read(new File(this.background)); 
     Graphics2D big = this.background_image.createGraphics(); 
     Rectangle rectangle = new Rectangle(0, 0, 20, 20); 
     g2.setPaint(new TexturePaint(this.background_image, rectangle)); 

     Rectangle rect = new Rectangle(0, 0, this.getWidth(), this.getHeight()); 
     g2.fill(rect); 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

А класс, который должен рисовать карты:

@Override 
public void paint(Graphics g) { 
    try { 
     this.image = ImageIO.read(new File("Ressources/images/cardsprite.gif")); 

     //4 lines 
     for (int i = 0; i < 4; i++) { 
      //13 rows 
      for (int j = 0; j < 13; j++) { 
       //Split one card 
       BufferedImage temp = this.image.getSubimage(j * this.CARD_WIDTH, 
         i * this.CARD_HEIGHT, this.CARD_WIDTH, this.CARD_HEIGHT); 

       g.drawImage(temp, j * this.CARD_WIDTH, 
         i * this.CARD_HEIGHT, this); 
      } 
     } 


    } catch (IOException ex) { 
     Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Если я ставлю карты рисования класса в метод рисования Майна, он отлично работает ,

Я что-то упустил?

Спасибо

ответ

0

По существу, вы нарушаете краски цепь, которая предотвращает ваш «основной» класс от живописи любого из его детей.

Начните с обзора Painting in AWT and Swing, чтобы ознакомиться с краской.

Вы также не должны быть переопределяющими paint, но вместо этого следует переопределить paintComponent от чего-то, что расширяет JComponent.

Посмотрите на Performing Custom Painting для получения более подробной информации.

В принципе, вы должны создать панель «назад», которая отвечает за покраску фона, а затем добавит компонент, ответственный за покраску карт поверх него, убедившись, что он прозрачный (setOpaque(false)), поэтому фон показывает.

Если вы не используете какие-либо динамические эффекты, вы можете даже у нас JLabel для фоновой панели.

Вам следует избегать делать что-либо в любом методе paintXxx, который может быть потенциально трудоемким, например, загружать изображения. Процесс окраски следует оптимизировать, чтобы он работал как можно быстрее ...

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