問題
(1)
Main.FrameにFlowLayoutを適用したのですが、実行するとlabelsが横一列に並び期待した見た目にはなりませんでした。
下の方に書いてある「ソースコード(期待する見た目)」ではJLayeredPaneを使用していないのですが、Window.java内にあるlabelsを背面においてlabelを前面においておきたいのでJLayeredPaneを使用しました。
(2)
label.setLocation(50, 50);
としてlabelの位置を変えたつもりですが、反映されませんでした。
この2つの問題が解決せず、質問しました。
どうぞよろしくお願いします。
ソースコード
Main.java
Java
1import javax.swing.SwingUtilities; 2 3public class Main { 4 5 private final static int rows = 5; 6 private final static int columns = 5; 7 8 public static void main(String[] args) { 9 10 SwingUtilities.invokeLater(new Runnable() { 11 public void run() { 12 new Window(rows, columns).setVisible(true); 13 } 14 }); 15 16 } 17 18} 19
Window.java
Java
1import java.awt.Color; 2import java.awt.Dimension; 3import java.awt.FlowLayout; 4 5import javax.swing.JFrame; 6import javax.swing.JLabel; 7import javax.swing.JLayeredPane; 8import javax.swing.border.LineBorder; 9 10public class Window extends JFrame { 11 12 private final int rows; 13 private final int columns; 14 15 Window(final int rows, final int columns) { 16 this.rows = rows; 17 this.columns = columns; 18 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 19 setBounds(500, 150, columns * 80 + 20, rows * 80 + 40); 20 setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 21 22 Movement mv = new Movement(); 23 24 Frame frame = new Frame(rows, columns); 25 add(frame); 26 27 } 28 29 public class Frame extends JLayeredPane { 30 31 Frame(final int rows, final int columns) { 32 setSize(columns * 80 + 20, rows * 80 + 40); 33 setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 34 35 Movement mv = new Movement(); 36 37 JLabel[][] labels = new JLabel[rows][columns]; 38 for(int i = 0; i < rows; i++) { 39 for(int j = 0; j < columns; j++) { 40 labels[i][j] = new JLabel(); 41 labels[i][j].setPreferredSize(new Dimension(80, 80)); 42 labels[i][j].setText(i + ", " + j); 43 labels[i][j].setBorder(new LineBorder(Color.BLACK, 2, true)); 44 labels[i][j].setOpaque(true); 45 labels[i][j].setBackground(Color.WHITE); 46 add(labels[i][j]); 47 setLayer(labels[i][j], DEFAULT_LAYER); 48 } 49 } 50 51 JLabel label = new JLabel("Label"); 52 label.setPreferredSize(new Dimension(80, 80)); 53 label.setLocation(50, 50); 54 label.setBorder(new LineBorder(Color.BLACK, 5, true)); 55 label.setOpaque(true); 56 label.setBackground(Color.WHITE); 57 add(label); 58 setLayer(label, DRAG_LAYER); 59 mv.addMovementListener(label); 60 61 } 62 63 } 64 65} 66 67
Movement.java
Java
1package que; 2 3import java.awt.event.MouseEvent; 4import java.awt.event.MouseListener; 5import java.awt.event.MouseMotionListener; 6 7import javax.swing.JLabel; 8 9public class Movement implements MouseListener, MouseMotionListener { 10 11 private int X, Y; 12 13 public Movement() {} 14 15 public void addMovementListener(JLabel... labels) { 16 for(JLabel label : labels) { 17 label.addMouseListener(this); 18 label.addMouseMotionListener(this); 19 } 20 } 21 22 @Override 23 public void mouseDragged(MouseEvent e) { 24 e.getComponent().setLocation(e.getX() + e.getComponent().getX() - X, e.getY() + e.getComponent().getY() - Y); 25 } 26 27 @Override 28 public void mouseMoved(MouseEvent e) {} 29 30 @Override 31 public void mouseClicked(MouseEvent e) {} 32 33 @Override 34 public void mousePressed(MouseEvent e) { 35 X = e.getX(); 36 Y = e.getY(); 37 } 38 39 @Override 40 public void mouseReleased(MouseEvent e) {} 41 42 @Override 43 public void mouseEntered(MouseEvent e) {} 44 45 @Override 46 public void mouseExited(MouseEvent e) {} 47 48} 49
ソースコード(期待する見た目)
Main.javaとMovement.javaは同じ
Window.java
Java
1import java.awt.Color; 2import java.awt.Dimension; 3import java.awt.FlowLayout; 4 5import javax.swing.JFrame; 6import javax.swing.JLabel; 7import javax.swing.border.LineBorder; 8 9public class Window extends JFrame { 10 11 private final int rows; 12 private final int columns; 13 14 Window(final int rows, final int columns) { 15 this.rows = rows; 16 this.columns = columns; 17 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 18 setBounds(500, 150, columns * 80 + 20, rows * 80 + 40); 19 setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 20 21 Movement mv = new Movement(); 22 23 JLabel[][] labels = new JLabel[rows][columns]; 24 for(int i = 0; i < rows; i++) { 25 for(int j = 0; j < columns; j++) { 26 labels[i][j] = new JLabel(); 27 labels[i][j].setPreferredSize(new Dimension(80, 80)); 28 labels[i][j].setText(i + ", " + j); 29 labels[i][j].setBorder(new LineBorder(Color.BLACK, 2, true)); 30 labels[i][j].setOpaque(true); 31 labels[i][j].setBackground(Color.WHITE); 32 add(labels[i][j]); 33 } 34 } 35 36 JLabel label = new JLabel("Label"); 37 label.setPreferredSize(new Dimension(80, 80)); 38 label.setLocation(50, 50); 39 label.setBorder(new LineBorder(Color.BLACK, 5, true)); 40 label.setOpaque(true); 41 label.setBackground(Color.WHITE); 42 add(label); 43 mv.addMovementListener(label); 44 45 } 46 47} 48 49
期待する見た目
(↑ではlabelがlabelsの背面にありますが、期待するのはlabelを前面にすることです。)
その他
Eclipse 2019-06
Java SE 8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/03 04:48
2019/09/03 12:25 編集
2019/09/03 13:33
2019/09/03 17:16
2019/09/04 03:02
2019/09/04 05:18
2019/09/04 05:46
2019/09/04 09:19 編集
2019/09/04 09:43