実現したいこと
添付JavaプログラムでmouseClickedイベントを ”常に” 拾えるようにしたい。
前提
画面に表示された5x5のJLabelを次々にクリックし、mouseClickedイベントを拾ってJLabellの色を変更(白<->水色)したいのですが、イベントを拾えない場合がしばしば発生します。同じJLabelを繰り消しクリックすると拾えることが多いです。
該当のソースコード
java
1import java.awt.Color; 2import java.awt.Container; 3import java.awt.Dimension; 4import java.awt.event.MouseAdapter; 5import java.awt.event.MouseEvent; 6 7import javax.swing.BorderFactory; 8import javax.swing.JFrame; 9import javax.swing.JPanel; 10import javax.swing.JRootPane; 11import javax.swing.border.LineBorder; 12 13public class TEST extends JFrame { 14 //---------------------------------------------------------- 15 static public void main(String args[]) { new TEST(); } 16 //---------------------------------------------------------- 17 public TEST() { 18 19 JRootPane root = getRootPane(); 20 root.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.RED)); 21 setLocationRelativeTo(null); 22 setResizable(false); 23 24 JPanel p = new JPanel(); 25 p.setPreferredSize(new Dimension( 50*5, 50*5 )); 26 p.setLayout(null); 27 Container cp = getContentPane(); 28 cp.add(p); 29 30 for (int row=0; row<5; row++) for (int col=0; col<5; col++) 31 p.add(new Box(row, col)); 32 33 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 34 pack(); 35 setVisible(true); 36 } 37} 38//-------------------------------------------------------------- 39class Box extends JPanel { 40 int r, c; 41 Box(int row, int col) { 42 r = row; 43 c = col; 44 setBounds(50*c,50*r, 50,50); 45 setBorder(new LineBorder(Color.BLACK, 1, true)); 46 setBackground(Color.WHITE); 47 setLayout(null); 48 addMouseListener(new MyMouseAdapter()); 49 } 50 private class MyMouseAdapter extends MouseAdapter { 51 @Override 52 public void mouseClicked(MouseEvent e) { 53 System.out.println("mouseClicked "+(r+1)+"-"+(c+1)); 54 Color c = getBackground(); 55 setBackground(c==Color.WHITE ? Color.CYAN: Color.WHITE); 56 } 57 } 58}
試したこと
MouthAdapterではなくMouseListenerでも同じ現象でした。
補足情報(FW/ツールのバージョンなど)
jdk21 windows-x64_bin.exeをインストール
Eclipse 2025上で開発
コードは「コードのマークダウン」を用いてご提示ください。でないと、コードの一部が文字修飾等のマークダウンとされて消えてしまう場合があります。
具体的には、コードを 「```java」の行と「```」 の行で挟んでください。
「イベントを拾えない」とはどのように判断されたのでしょうか。
MyMouseAdapterの mouseClicked()が呼ばれれば、Eclipseのコンソールに
System.out.println("mouseClicked "+(r+1)+"-"+(c+1));
の結果が表示されるのですが、されないことで確認しました。
rとc は5行5列のBoxのどれがクリックされたかを表しています。また、イベントが拾えれば、画面上のBoxの色が変化しますが、変化しません。
イベントを拾える・拾えないは、画面上の5x5のBoxを連続的にクリックすると、両方の場合が混在して現れます。

回答2件
あなたの回答
tips
プレビュー