実現したいこと
CirclePanelというJPanelを継承したクラスがあり、その中で作っている図形をクリックした時だけmouseClicked()を反応させたいのですが、どこをクリックしてもmouseClicked()が反応します。どうすれば「特定のpaintComponent(Graphics g)」だけを指定してmouseClicked()メソッドが反応するようになるのかどなたか教えてください。よろしくお願いします。
発生している問題・エラーメッセージ
なし
該当のソースコード
java
1 2 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.Graphics2D; 6import java.awt.event.MouseEvent; 7import java.awt.event.MouseListener; 8import java.awt.geom.Ellipse2D; 9 10import javax.swing.JFrame; 11import javax.swing.JLabel; 12import javax.swing.JPanel; 13import javax.swing.JSlider; 14import javax.swing.event.ChangeEvent; 15import javax.swing.event.ChangeListener; 16 17 18public class TestFrame extends JFrame implements ChangeListener,MouseListener { 19 public static void main(String[] args) { 20 new TestFrame().setVisible(true); 21 } 22 23 private JSlider slider; 24 private JLabel label; 25 private CirclePanel circlePanel; //stateChanged メソッドで使うのでフィールド化 26 27 TestFrame() { 28 super("Swingサンプル(円の描画)"); 29 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 30 setSize(800, 800); 31 32 circlePanel = new CirclePanel(); 33 circlePanel.addMouseListener(this); 34 setContentPane(circlePanel); 35 36 label = new JLabel("test"); 37 label.setBounds(300, 10, 100, 100); 38 add(label); 39 40 JLabel label2 = new JLabel("テスト"); 41 label2.setBounds(300, 500, 100, 100); 42 add(label2); 43 44 slider = new JSlider(50, 150, 100); //最小値, 最大値, 初期値 45 slider.addChangeListener(this); 46 JPanel p = new JPanel(); 47 p.add(slider); 48 p.setBounds(300, 300, 200, 50); //見易いようにちょっと大きく 49 add(p); 50 } 51 52 public void stateChanged(ChangeEvent e) { 53 label.setText("値:" + slider.getValue()); 54 int value = slider.getValue(); 55 circlePanel.setDiameter(value); //直径をスライダーの値に変更 56 } 57 58 59 private static class CirclePanel extends JPanel { 60 private final int X = 350, Y = 250; //円の中心 61 private int diameterOfCircle = 100; //円の直径 62 63 CirclePanel() { 64 super(null); //レイアウトマネージャ無し 65 setBackground(Color.WHITE); //背景色 66 } 67 68 /** 69 * 円の直径を設定する 70 * @param diameter 直径 [px] 71 */ 72 void setDiameter(int diameter) { 73 this.diameterOfCircle = diameter; 74 repaint(); //再描画依頼(後に Swing が paintComponent を呼んでくれる) 75 } 76 77 @Override 78 protected void paintComponent(Graphics g) { 79 super.paintComponent(g); 80 81 Graphics2D g2 = (Graphics2D) g; 82 g2.setColor(Color.BLUE); 83 Ellipse2D ellipse = new Ellipse2D.Double(X-diameterOfCircle/2, Y-diameterOfCircle/2, diameterOfCircle, diameterOfCircle); 84 g2.fill(ellipse); 85 } 86 } 87 88 89@Override 90public void mouseClicked(MouseEvent e) { 91 // TODO 自動生成されたメソッド・スタブ 92 System.out.println("合計="); 93 94} 95 96@Override 97public void mousePressed(MouseEvent e) { 98 // TODO 自動生成されたメソッド・スタブ 99 100} 101 102@Override 103public void mouseReleased(MouseEvent e) { 104 // TODO 自動生成されたメソッド・スタブ 105 106} 107 108@Override 109public void mouseEntered(MouseEvent e) { 110 // TODO 自動生成されたメソッド・スタブ 111 112} 113 114@Override 115public void mouseExited(MouseEvent e) { 116 // TODO 自動生成されたメソッド・スタブ 117 118} 119}
回答1件
あなたの回答
tips
プレビュー