2015-03-15 6 views
2

Я создаю приложение типа моделирования, я хочу, чтобы для всех анимаций был использован один фоновый слой и еще один слой сверху. Им в настоящее время с помощью JlayeredPanes, но я не могу получить фона на верхнем слое, чтобы показать, как прозрачные, так что я могу видеть фон, любая помощь очень ценится, Heres код:JlayeredPane Transparency setOpaque не работает

фоновый слой

public class SimBackground extends JLayeredPane{ 

private Model theModel; 
private SimulationArea simulationArea; 

public SimBackground(Model theModel){ 
    this.theModel=theModel; 

    setBackground(new Color(0, 230, 0)); 
    setOpaque(true); 
    setPreferredSize(new Dimension(500,500)); 
    setVisible(true); 

} 
@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    for(int x=0;x<50;x++){ 
     for(int y=0;y<50;y++){ 

      g.drawRect((x*10), (y*10), 10, 10); 
     } 
    } 
} 

Верхний слой

public class SimulationArea extends JLayeredPane { 

private int SPEED = 100; 
private Model theModel; 
Timer timer; 

public SimulationArea(Model theModel){ 

    this.theModel = theModel; 

    setPreferredSize(new Dimension(500,500)); 
    setLocation(0,0); 

    setOpaque(false); 
    setBackground(new Color(0,0,0,0)); 
    setVisible(true); 

    //Swing Timer 
    timer = new Timer(SPEED,new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      update(); 
      repaint(); 
      revalidate(); 
     } 
    });  
} 
private void update() { 
    theModel.update(); 
} 
@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    Graphics2D g2d = (Graphics2D) g; 
    //test get 1 active object 

    ArrayList<ActiveObject> activeObjects = theModel.getActiveObjects(); 
    //System.out.println(activeObjects.size()); 
    for(int i=0; i<activeObjects.size(); i++){ 
     ActiveObject activeObject = theModel.getActiveObjects().get(i); 

     int x = activeObject.getCoordinates().getX(); 
     int y = activeObject.getCoordinates().getY(); 
     int size = activeObject.getSize(); 
     g2d.fillRect (x ,y , size, size); 
    } 
} 

Может кто-нибудь, пожалуйста, сообщите мне, что мне здесь не хватает?

+0

Подождите, верхний слой проходит JLayeredPane? Извините, но это путает меня до конца. Разве ваша JLayeredPane не должна быть нижней частью, контейнер, который содержит ** все ** слои? И ни один из слоев не должен расширять JLayeredPane. JPanel или JComponent, да, но не JLayeredPane. И вы должны использовать метод 'paintComponent (...)' JPanel не в JLayeredPane. И прочитайте учебник JLayeredPane, потому что это не похоже, что вы знаете, как их использовать. Вы можете найти его здесь ... [как использовать слоистые панели] (http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html) –

+0

это только панели, я havent разместил код для панели, если они не расширяют JlayeredPane, как я могу создать их в своем классе? Я не мог найти их примеров в своем классе. –

+0

. Вы использовали бы один JLayeredPane, скорее всего, не расширили его, и вы добавите объекты, которые расширят JPanel или JComponent до единственной JLayeredPane. Есть много примеров его использования на этом сайте, некоторые из которых написаны мной. –

ответ

2

Не используйте JLayeredPane, но если вам нужно использовать JLayeredPane в будущем, вы захотите прочитать руководство here, так как в соответствии с моим комментарием вы не используете их правильно. Вместо этого я рекомендую вам упростить, выполнив весь чертеж в одном JPanel, создав свой фон в BufferedImage, возможно, в конструкторе, а затем рисуем это изображение и ваши спрайты в методе paintComponent JPanel.

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 

public class SimExample extends JPanel { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = PREF_W; 
    private static final Color BKGD_COLOR = new Color(0, 230, 0); 
    private BufferedImage bkgrnd = new BufferedImage(PREF_W, PREF_H, 
     BufferedImage.TYPE_INT_ARGB); 

    public SimExample() { 
     Graphics2D g = bkgrnd.createGraphics(); 
     g.setBackground(BKGD_COLOR); 
     g.clearRect(0, 0, PREF_W, PREF_H); 
     g.setColor(Color.black); 
     for (int x = 0; x < 50; x++) { 
     for (int y = 0; y < 50; y++) { 

      g.drawRect((x * 10), (y * 10), 10, 10); 
     } 
     } 
     g.dispose(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     if (bkgrnd != null) { 
     g.drawImage(bkgrnd, 0, 0, null); 
     } 

     // draw sprites here 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     SimExample mainPanel = new SimExample(); 

     JFrame frame = new JFrame("SimExample"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

Это означало бы рисование его снова и снова, не так ли? –

+0

@ user3081855: для рисования BufferedImage мало затрат. –

+0

Отлично, я изначально сделал это, но по какой-то причине подумал, что было бы лучше для производительности отпереть слои –

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