質問編集履歴

1

サンプルソースを追加。

2024/07/29 14:10

投稿

mipemipe
mipemipe

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,24 +1,150 @@
1
1
  ### 実現したいこと
2
2
  JavaのSwingでGUIを作ろうとしています。
3
- 同じJPanelにJLabelを2枚、少しズラして重ねていますが
3
+ 同じJPanelにJLabelを2枚
4
- 重なっている部分にポインターを持っいった場合、下になっているラベルでMouseEvent受け取りたいです。
4
+ 上のラベルはパネル全体を覆っていてクリック位置エフェクト(仮)出します。
5
+ 下のラベルはボタンです。
5
6
 
6
-
7
+ クリック位置にエフェクトを出しつつ、下のラベルでもMouseEventを受け取りたい。
7
-
8
8
 
9
9
  ### 発生している問題・分からないこと
10
- 一部だけ重なっているイメージです。
11
10
  重なった場所にマウスカーソルが入ると、描画されている上のラベルだけがイベントを拾います。
12
11
  しかし可能であれば両方のラベルで同じようにイベントをハンドリングしたいです。
13
12
  いい方法はないでしょうか?
14
13
 
14
+ ### 該当のソースコード
15
+ ```Java
16
+ package test;
15
17
 
18
+ import java.awt.Color;
19
+ import java.awt.Graphics;
20
+ import java.awt.event.MouseEvent;
21
+ import java.awt.event.MouseListener;
16
22
 
17
- ### 該当のソースコード
23
+ import javax.swing.JFrame;
24
+ import javax.swing.JLabel;
25
+ import javax.swing.JPanel;
18
26
 
27
+ public class Test {
28
+
29
+ public static void main(String[] args) {
30
+
31
+ JFrame window = new JFrame("test");
32
+ window.setSize(300, 200);
33
+ window.setLocationRelativeTo(null);
34
+ window.setVisible(true);
35
+
36
+ JPanel panel_1 = new JPanel();
37
+ panel_1.setBounds(0, 0, 300, 200);
38
+ panel_1.setBackground(Color.GRAY);
39
+
40
+ EffectLabel label_1 = new EffectLabel();
41
+ label_1.addMouseListener(label_1);
42
+ label_1.setOpaque(false);
43
+ label_1.setBounds(0, 0, 300, 200);
44
+
45
+ ClickLabel label_2 = new ClickLabel();
46
+ label_2.addMouseListener(label_2);
47
+ label_2.setOpaque(true);
48
+ label_2.setBackground(Color.RED);
49
+ label_2.setBounds(90, 55, 100, 50);
50
+
51
+ window.add(panel_1);
52
+ panel_1.add(label_1);
53
+ panel_1.add(label_2);
54
+
55
+ JLabelThread thread = new JLabelThread();
56
+ thread.setJLabel(label_1);
57
+ thread.start();
58
+
59
+ }
60
+ }
61
+
62
+ class EffectLabel extends JLabel implements MouseListener{
63
+
64
+ private boolean click = false;
65
+ private int point_x, point_y;
66
+ private int count = 255;
67
+
68
+ @Override
69
+ public void mouseClicked(MouseEvent e) {
70
+ point_x = e.getX() - 10;
71
+ point_y = e.getY() - 10;
72
+ click = true;
73
+ }
74
+
75
+ @Override
76
+ public void mousePressed(MouseEvent e) {
77
+ }
78
+
79
+ @Override
80
+ public void mouseReleased(MouseEvent e) {
81
+ }
82
+
83
+ @Override
84
+ public void mouseEntered(MouseEvent e) {
85
+ }
86
+
87
+ @Override
88
+ public void mouseExited(MouseEvent e) {
89
+ }
90
+
91
+ @Override
92
+ protected void paintComponent(Graphics g) {
93
+ super.paintComponent(g);
94
+
95
+ if(click) {
96
+ g.setColor(new Color(255,255,255,count));
97
+ g.fillRect(point_x, point_y, 20, 20);
98
+ count -= 1;
99
+ if(count < 0) {
100
+ click = false;
101
+ count = 255;
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ class ClickLabel extends JLabel implements MouseListener{
108
+
109
+ @Override
110
+ public void mouseClicked(MouseEvent e) {
111
+ System.out.println("Click!!");
112
+ }
113
+
114
+ @Override
115
+ public void mousePressed(MouseEvent e) {
116
+ }
117
+ @Override
118
+ public void mouseReleased(MouseEvent e) {
119
+ }
120
+
121
+ @Override
122
+ public void mouseEntered(MouseEvent e) {
123
+ }
124
+
125
+ @Override
126
+ public void mouseExited(MouseEvent e) {
127
+ }
128
+ }
129
+
130
+ class JLabelThread extends Thread{
131
+
132
+ JLabel label = null;
133
+
134
+ public void setJLabel(JLabel l) {
135
+ label = l;
136
+ }
137
+
138
+ @Override
139
+ public void run() {
140
+ super.run();
141
+ while(true) {
142
+ if(label != null) label.repaint();;
143
+ }
144
+ }
145
+ }
19
146
  ```
20
- 特になし
147
+
21
- ```
22
148
 
23
149
  ### 試したこと・調べたこと
24
150
  - [x] teratailやGoogle等で検索した