2016-03-09 2 views
1

Я пытаюсь создать простую анимацию, в которой пловцу следует путь под водой. У меня есть два JPanels - один для пловца и один для фона. Оба они активны, пловцы перемещают свои конечности, а на фоне есть рыба/препятствия, которые необходимо обновить.Укладка двух активных JPanels друг на друга

Я пытаюсь положить пловец сверху фона. Я пытаюсь использовать JLayeredPane, поэтому я создаю два слоя и добавить их:

JLayeredPane lp = frame.getLayeredPane(); 
lp.setPreferredSize(new Dimension(650, 550)); 

underwaterScene.setSize(lp.getPreferredSize()); 
underwaterScene.setLocation(0,0); 

swimmer.setSize(lp.getPreferredSize()); 
swimmer.setLocation(0,0); 
swimmer.setOpaque(false); 

lp.add(underwaterScene, Integer.valueOf(1)); 
lp.add(swimmer, Integer.valueOf(2)); 

метод paintComponent пловец просто рисует пловец в правильном месте:

g.drawImage(swimmer.sprite, swimmer.x, swimmer.y, 150, 100, null); 

В настоящее время, только я см. слой пловец. Если я удалю lp.add (пловчик ... звонок, то я могу увидеть фоновый слой, поэтому я знаю, что он добавляется.

Мой вопрос: почему не пловец появляется на фоне без ?!. полностью блокирует его

заранее спасибо за любую помощь

+0

Наверное, это не лучший выбор для настройки, вместо этого я бы подумал об использовании пользовательского подхода к рисованию вместо – MadProgrammer

ответ

0

Вот рабочий пример

Кроме того, вы можете узнать его контекст здесь: https://github.com/fzoli/RemoteControlCar/blob/master/desktop/BrowserTest/src/ConstrainVisibility.java#L58

public class ConstrainVisibility extends JPanel { 

    protected static final String LS = System.getProperty("line.separator"); 
    protected static final int OFFSET_X = 150; 
    protected static final int OFFSET_Y = 120; 
    protected static final int WIDTH = 200; 
    protected static final int HEIGHT = 200; 

    public ConstrainVisibility() { 
    super(new BorderLayout()); 
    JLayeredPane layeredPane = new JLayeredPane(); 
    layeredPane.setOpaque(true); 
    layeredPane.setBackground(new Color(200, 200, 255)); 
    int layerIndex = 0; 
    // A flash player 

    // A swing panel 
    JPanel swingPanel = new JPanel(); 
    swingPanel.setBorder(BorderFactory.createTitledBorder("Swing JPanel")); 
    swingPanel.setBackground(Color.GREEN); 
    swingPanel.setBounds(OFFSET_X * layerIndex, OFFSET_Y * layerIndex, WIDTH, HEIGHT); 
    layeredPane.setLayer(swingPanel, layerIndex++); 
    layeredPane.add(swingPanel); 
    // A web browser 
    JWebBrowser webBrowser = new JWebBrowser(JWebBrowser.constrainVisibility()); 
    webBrowser.setBarsVisible(false); 
    webBrowser.setStatusBarVisible(true); 
    webBrowser.setHTMLContent(
     "<html>" + LS + 
     " <body>" + LS + 
     " <h1>A web page</h1>" + LS + 
     " <p>A paragraph with a <a href=\"http://www.google.com\">link</a>.</p>" + LS + 
     " </body>" + LS + 
     "</html>"); 
    webBrowser.setBounds(OFFSET_X * layerIndex, OFFSET_Y * layerIndex, WIDTH, HEIGHT); 
    layeredPane.setLayer(webBrowser, layerIndex++); 
    // A swing button 
    JButton swingButton = new JButton("Swing JButton"); 
    swingButton.setBounds(OFFSET_X * layerIndex, OFFSET_Y * layerIndex, WIDTH, HEIGHT); 
    layeredPane.setLayer(swingButton, layerIndex++); 
    layeredPane.add(swingButton); 
    layeredPane.add(webBrowser); 
    layeredPane.setPreferredSize(new Dimension(WIDTH + OFFSET_X * (layerIndex - 1), HEIGHT + OFFSET_Y * (layerIndex - 1))); 
    add(new JScrollPane(layeredPane), BorderLayout.CENTER); 
    } 

    /* Standard main method to try that test as a standalone application. */ 
    public static void main(String[] args) { 
    UIUtils.setPreferredLookAndFeel(); 
    NativeInterface.open(); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     JFrame frame = new JFrame("DJ Native Swing Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ConstrainVisibility(), BorderLayout.CENTER); 
     frame.setSize(800, 600); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     } 
    }); 
    NativeInterface.runEventPump(); 
    } 

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