有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将两个活动JPanel层叠在一起

我试图创建一个简单的动画,让游泳者沿着水下的路径。我有两个JPanel——一个是游泳运动员,一个是背景。两者都处于活动状态,游泳者正在移动四肢,背景中有鱼/障碍物需要更新

我试图把游泳者置于背景之上。我试图使用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。添加(游泳者…打电话,然后我可以看到背景层,所以我知道它正在添加

我的问题是:为什么游泳者出现在背景之上时没有完全阻挡它

提前感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    下面是一个有效的例子

    此外,你可以在这里找到它的上下文: 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();
      }
    
    }