Размещение прозрачного JPanel поверх другого JPanel не работает

Я пытаюсь поместить JPanel поверх другого JPanel, который содержит JTextArea и кнопку, и я хочу, чтобы верхний слой был прозрачным. Я попробовал это, сделав setOpaque (false) верхней панели. Но это не работает. Может ли кто-нибудь помочь мне пройти через это? Заранее спасибо!

public class JpanelTest extends JPanel
{
    public JpanelTest()
    {
    super();
    onInit();
}
private void onInit()
{
    setLayout(new BorderLayout());

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(new JTextArea(100,100),BorderLayout.CENTER);
    panel.add(new JButton("submit"),BorderLayout.SOUTH);

    JPanel glass = new JPanel();
    glass.setOpaque(false);

    add(panel,BorderLayout.CENTER);
    add(glass,BorderLayout.CENTER);
    setVisible(true);
}

public static void main(String args[])
{
    new JpanelTest();
}
}

Ответ 1

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

Начиная с вашего кода и меняя его много, я получил его на работу, но он может не делать то, что вы ожидаете...

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{
  public Test()
  {
    super();

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 200);

    onInit();

    setVisible(true);
  }
  private void onInit()
  {
    JLayeredPane lp = getLayeredPane();

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(new JTextArea(), BorderLayout.CENTER);
    panel.add(new JButton("Submit"), BorderLayout.SOUTH);
    panel.setSize(300, 150); // Size is needed here, as there is no layout in lp

    JPanel glass = new JPanel();
    glass.setOpaque(false); // Set to true to see it
    glass.setBackground(Color.GREEN);
    glass.setSize(300, 150);
    glass.setLocation(10, 10);

    lp.add(panel, Integer.valueOf(1));
    lp.add(glass, Integer.valueOf(2));
  }

  public static void main(String args[])
  {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        new Test();
      }
    });
  }
}

Если полностью прозрачный, ну, это похоже на то, что его нет! Когда он непрозрачен, он просто закрывает некоторые GUI, но, например, не мешает щелчкам мыши.

Ответ 2

Ознакомьтесь с этим руководством по использованию Swing Root Panes.

Стеклянная панель полезна, когда вы хотите улавливать события или рисовать по области, которая уже содержит один или несколько компонентов. Например, вы можете деактивировать события мыши для многокомпонентной области, заставляя стеклянную панель перехватывать события. Или вы можете отображать изображение по нескольким компонентам, используя стеклянную панель.

Ответ 3

1) существует несколько способов, нет проблемы с тем, чтобы поставить JPanel с полным полным JFrames/JPanel area или только частью Rectangle / Dimension, которая возвращает JFrames/JPanel

  • используйте JLayer(Java7) на основе JXLayer (Java6)

  • использовать GlassPane

  • использовать JViewport

  • использовать OverlayLayout

  • использовать прозрачный JDialog / JWindow

2) все зависит от того, хотите ли вы защитить от mouse и клавишу events от top layer до bottom, или нет (чтобы избежать redispatch событий from - to и наоборот)