質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

1183閲覧

JButtonを半透明のJPanelで覆ったとき貫通してしまう

RayLight

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2020/11/03 03:09

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.ActionListener; 4import java.awt.event.MouseAdapter; 5 6public class TestMain extends JFrame { 7 8 private static final Dimension frameSize = new Dimension(400,600); 9 private final JPanel mainPanel; 10 public static void main(String[] args) { 11 new TestMain(); 12 } 13 14 public TestMain() { 15 this.mainPanel = getPanel(); 16 getContentPane().add(mainPanel); 17 setDefaultCloseOperation(EXIT_ON_CLOSE); 18 setPreferredSize(frameSize); 19 setSize(frameSize); 20 setVisible(true); 21 } 22 23 private JPanel getPanel() { 24 JPanel basePanel = new JPanel(); 25 basePanel.setLayout(new OverlayLayout(basePanel)); 26 basePanel.setPreferredSize(frameSize); 27 28 SpringLayout layout = new SpringLayout(); 29 JPanel panel1 = new JPanel(layout); 30 panel1.setPreferredSize(frameSize); 31 32 JButton button1 = new JButton(); 33 button1.setText("button1"); 34 button1.addActionListener(getListener()); 35 layout.putConstraint(SpringLayout.VERTICAL_CENTER,button1,0,SpringLayout.VERTICAL_CENTER,panel1); 36 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER,button1,0,SpringLayout.HORIZONTAL_CENTER,panel1); 37 panel1.add(button1); 38 39 basePanel.add(panel1); 40 41 42 return basePanel; 43 } 44 private ActionListener getListener() { 45 SpringLayout layout2 = new SpringLayout(); 46 JPanel backGround = new JPanel(layout2); 47 //---------backGround------------------ 48 backGround.setPreferredSize(frameSize); 49 backGround.setBackground(new Color(0,0,0,150)); 50 MouseAdapter adapter = new MouseAdapter() { 51 }; 52 backGround.addMouseMotionListener(adapter); 53 backGround.addMouseListener(adapter); 54 //------------------------------------- 55 SpringLayout layout = new SpringLayout(); 56 JPanel panel = new JPanel(layout); 57 panel.setPreferredSize(new Dimension(400,50)); 58 59 JButton button2 = new JButton(); 60 button2.setText("button2"); 61 layout.putConstraint(SpringLayout.VERTICAL_CENTER,button2,0,SpringLayout.VERTICAL_CENTER,panel); 62 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER,button2,0,SpringLayout.HORIZONTAL_CENTER,panel); 63 panel.add(button2); 64 65 layout2.putConstraint(SpringLayout.NORTH,panel,40,SpringLayout.NORTH,backGround); 66 backGround.add(panel); 67 68 return event -> { 69 mainPanel.add(backGround); 70 mainPanel.setComponentZOrder(backGround,0); 71 mainPanel.validate(); 72 mainPanel.repaint(); 73 }; 74 } 75}

上記のコードで実行したところbutton2を押したときにbutton1backGroundを貫通して最前面に表示されてしまいます。
```backGround.getComponentZOrder()``に変化はありませんでした。
どう改善すればよいかご教授いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2020/11/05 09:38

ちょっとやってみたんですが、Swingの透過周りはほんとに難しいですね^^; GlassPaneかJLayeredPaneでやるのがいいと思うのですが、Locationを入れる入れないの違いで不透過になったりしてあまりの不安定さに力尽きましたw [GlassPaneとブロッカ - Kazzz's diary](http://kazzz.hatenablog.com/entry/20080105/p1 こちらが参考になるかもしれません。
RayLight

2020/11/06 11:55

大変参考になりました。 ありがとうございます。
guest

回答1

0

自己解決

java

1private ActionListener getListener() { 2 SpringLayout layout2 = new SpringLayout(); 3 TestGlassPane backGround = new TestGlassPane(); 4 backGround.setLayout(layout2); 5 //---------backGround------------------ 6 backGround.setPreferredSize(frameSize); 7 backGround.setBackground(new Color(0,0,0,150)); 8 MouseAdapter adapter = new MouseAdapter() { 9 }; 10 backGround.addMouseMotionListener(adapter); 11 backGround.addMouseListener(adapter); 12 //------------------------------------- 13 SpringLayout layout = new SpringLayout(); 14 JPanel panel = new JPanel(layout); 15 panel.setPreferredSize(new Dimension(400,50)); 16 17 JButton button2 = new JButton(); 18 button2.setText("button2"); 19 layout.putConstraint(SpringLayout.VERTICAL_CENTER,button2,0,SpringLayout.VERTICAL_CENTER,panel); 20 layout.putConstraint(SpringLayout.HORIZONTAL_CENTER,button2,0,SpringLayout.HORIZONTAL_CENTER,panel); 21 panel.add(button2); 22 23 layout2.putConstraint(SpringLayout.NORTH,panel,40,SpringLayout.NORTH,backGround); 24 backGround.add(panel); 25 26 27 return event -> { 28 setGlassPane(backGround); 29 backGround.setVisible(true); 30 }; 31 }
public class TestGlassPane extends JComponent { @Override protected void paintComponent(Graphics g) { Graphics componentGraphics = getComponentGraphics(g); Graphics2D co = (Graphics2D) componentGraphics.create(); co.setColor(getBackground()); co.fillRect(0,0,getWidth(),getHeight()); paintChildren(co); co.dispose(); } }

自前で半透明用のPanelを用意することで解決できました(JPanelはGlassPaneでは半透明にならないため)

投稿2020/11/06 11:55

RayLight

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問