12

JTextAreaとボタンを含む別のJPanelの上にJPanelを配置しようとしていますが、上部のapnelを透明にしたいです。上部パネルの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();
}
}
4

3 に答える 3

6

確かに、パネルを重ねて必要な理由を説明すると便利です。

あなたのコードから始めて、それをたくさん変更して、私はそれを動作させました、しかしそれはあなたが期待することをしないかもしれません...

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's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        new Test();
      }
    });
  }
}

完全に透明なら、まあ、それはここにないようなものです!不透明な場合、GUIの一部をカバーするだけですが、たとえば、マウスのクリックを防ぐことはできません。

于 2012-12-28T12:32:22.240 に答える
5

1)いくつかの方法があり、JPanelを置くのに問題はなく、そのリターンJFrames/JPanel areaの全部または一部のみをカバーしますRectangle / DimensionJFrames/JPanel

  • JLayer(Java7)に基づいて使用JXLayer (Java6)

  • 使用するGlassPane

  • 使用するJViewport

  • 使用するOverlayLayout

  • transucentを使用するJDialog / JWindow

2)から保護するかどうか、mouseおよびキーeventsを使用top layerするかどうかによって、すべてが異なります(イベントbottomを回避するため、およびその逆) 。redispatchfrom - to

于 2012-12-28T12:11:26.517 に答える
4

SwingRootPanesの使用に関するこのチュートリアルを確認してください。

ガラスペインは、イベントをキャッチしたり、すでに1つ以上のコンポーネントが含まれている領域にペイントしたりできるようにする場合に便利です。たとえば、ガラスペインにイベントをインターセプトさせることで、マルチコンポーネント領域のマウスイベントを非アクティブ化できます。または、ガラスペインを使用して複数のコンポーネントに画像を表示することもできます。

于 2012-12-28T11:46:52.220 に答える