teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加

2019/09/04 05:17

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -8,4 +8,73 @@
8
8
  > JLayeredPaneは、Containerと同じように子のリストを管理しますが、内部で複数のレイヤーを定義することができます。同じレイヤーに属する子は、通常のContainerオブジェクトとまったく同じように管理されますが、子コンポーネントどうしがオーバーラップした場合には、上位のレイヤーのコンポーネントの方が下位レイヤーのコンポーネントより上に表示されます。
9
9
  > 各レイヤーには個別の整数値が割り当てられます。Componentのレイヤー属性を設定するには、add呼出しでIntegerオブジェクトを渡します。
10
10
  > たとえば、
11
- (以下略)
11
+ (以下略)
12
+
13
+ ----
14
+
15
+ 以下で labels の上に label が表示されました.
16
+ Frame コンストラクタ内での ```setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));``` では, レイアウトマネージャが全てのコンポーネントの配置を司る為に, setLocation が効かず label も並べてしまい, (確認していませんが)描画領域が制限されずに全て横一列に並べた上で中央部分を表示していたものと思われます.
17
+ また, Window コンストラクタ内の setLayout が有効では(これも原因は確認していませんが)表示がされませんでしたので, コメントにしました.
18
+
19
+ Window.java
20
+ ```java
21
+ import java.awt.Color;
22
+
23
+ import javax.swing.JFrame;
24
+ import javax.swing.JLabel;
25
+ import javax.swing.JLayeredPane;
26
+ import javax.swing.border.LineBorder;
27
+
28
+ import que.Movement;
29
+
30
+ public class Window extends JFrame {
31
+
32
+ private final int rows;
33
+ private final int columns;
34
+
35
+ Window(final int rows, final int columns) {
36
+ this.rows = rows;
37
+ this.columns = columns;
38
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
39
+ setBounds(500, 150, columns * 80 + 20, rows * 80 + 40);
40
+ //setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
41
+
42
+ Movement mv = new Movement();
43
+
44
+ Frame frame = new Frame(rows, columns);
45
+ add(frame);
46
+ }
47
+
48
+ public class Frame extends JLayeredPane {
49
+ Frame(final int rows, final int columns) {
50
+ setSize(columns * 80 + 20, rows * 80 + 40);
51
+ //setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
52
+ setLayout(null);
53
+
54
+ Movement mv = new Movement();
55
+
56
+ JLabel[][] labels = new JLabel[rows][columns];
57
+ for(int i = 0; i < rows; i++) {
58
+ for(int j = 0; j < columns; j++) {
59
+ labels[i][j] = new JLabel();
60
+ labels[i][j].setBounds(i * 80, j * 80, 80, 80);
61
+ labels[i][j].setText(i + ", " + j);
62
+ labels[i][j].setBorder(new LineBorder(Color.BLACK, 2, true));
63
+ labels[i][j].setOpaque(true);
64
+ labels[i][j].setBackground(Color.WHITE);
65
+ add(labels[i][j], DEFAULT_LAYER);
66
+ }
67
+ }
68
+
69
+ JLabel label = new JLabel("Label");
70
+ label.setBounds(50, 50, 80, 80);
71
+ label.setBorder(new LineBorder(Color.BLACK, 5, true));
72
+ label.setOpaque(true);
73
+ label.setBackground(Color.WHITE);
74
+ add(label, DRAG_LAYER);
75
+
76
+ mv.addMovementListener(label);
77
+ }
78
+ }
79
+ }
80
+ ```