• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MouseEventのつけ方)

MouseEventのつけ方について

このQ&Aのポイント
  • MouseEventのMouseEneterdに関することなのですが、扇形をいくつか合わせて円を描画する、いわゆるパイメニューみたいなものを作成するときの座標指定方法がわかりません。
  • 四角形ではなく扇形なので、座標指定方法が異なります。具体的な実装方法について調べてみましたが、よくわかりませんでした。
  • 他にもいい描画方法があれば教えていただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

こうかなあ…… import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; class Pie{ Arc2D content; Color color; boolean selected; Pie(double X,double Y,double A,double a,double b,Color color){ this.color=color; content=new Arc2D.Double(X,Y,X+A,Y+A,a,b,Arc2D.PIE); } } public class Demo extends JPanel{ int A=200; Pie[] pies=new Pie[]{ new Pie(0,0,A,0,120,Color.red) ,new Pie(0,0,A,120,120,Color.yellow) ,new Pie(0,0,A,240,120,Color.green)}; public Demo(){ setPreferredSize(new Dimension(A+1,A+1)); addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ for(int i=0;i<pies.length;i++){ pies[i].selected=false; if(pies[i].content.contains(e.getX(),e.getY())){ pies[i].selected=true; } } repaint(); } } ); } void drawPie(Graphics2D g2,Pie pie){ if(pie.selected){ g2.setColor(pie.color); g2.fill(pie.content); } g2.setColor(Color.black); g2.draw(pie.content); } /*コンポーネント描画*/ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 =(Graphics2D)g; for(int i=0;i<pies.length;i++){ drawPie(g2,pies[i]); } } public static void main(String[] args){ JFrame f=new JFrame(); f.setContentPane(new Demo()); f.pack();f.show(); } }

pulis
質問者

お礼

素早い解答ありがとうございます。早速ためしたところ意図する動作を致しましたが、この方法ですと、例えばクリックしたときアクションを入れたいときなどには、また記述の仕方が異なってくるのでしょうか。 実際はMouseEnteredだけでなく、クリック動作(MouseClicked)等もいれたいのですが。(MouseListener をimplementsする記述方法の場合) とはいえ大変参考になりました。ありがとうございました。

その他の回答 (1)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

#1です。 >例えばクリックしたときアクションを入れたいときなどには よくある、Javaに限らない、シンプルなやり方としては、 こんなの。 --- 例1: class Pie{ Arc2D content; boolean selected; Pie(double X,double Y,double A,double a,double b){ content=new Arc2D.Double(X,Y,X+A,Y+A,a,b,Arc2D.PIE); } } public class Demo extends JPanel{ int A=200; Pie[] pies=new Pie[]{ new Pie(0,0,A,0,120) ,new Pie(0,0,A,120,120) ,new Pie(0,0,A,240,120)}; Demo(){ setPreferredSize(new Dimension(A+1,A+1)); addMouseListener( new MouseAdapter(){ public void mouseClicked(MouseEvent e){ int select=0; for(int i=0;i<pies.length;i++){ if(pies[i].content.contains(e.getX(),e.getY())){ select=i;break; } } //↓ココに各メニュー処理を「じかに列挙」する switch(select){ case 0:System.out.println("りんご");break; case 1:System.out.println("レモン");break; case 2:System.out.println("みかん");break; } } } ); } void drawPie(Graphics2D g2,Pie pie){ g2.setColor(Color.black); g2.draw(pie.content); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 =(Graphics2D)g; for(int i=0;i<pies.length;i++){ drawPie(g2,pies[i]); } } public static void main(String[] args){/*#1に同じ*/} } ------------ 例2: interface Task{void execute();} class Pie{ Task task; Arc2D content; boolean selected; Pie(double X,double Y,double A,double a,double b,Task t){ task=t; content=new Arc2D.Double(X,Y,X+A,Y+A,a,b,Arc2D.PIE); } void doAction(){task.execute();} } public class Demo extends JPanel{ int A=200; //↓各メニュー処理内容の「オブジェクト」 Task t1=new Task(){public void execute(){System.out.println("りんご");}} ,t2=new Task(){public void execute(){System.out.println("レモン");}} ,t3=new Task(){public void execute(){System.out.println("みかん");}}; Pie[] pies=new Pie[]{ new Pie(0,0,A,0,120,t1) ,new Pie(0,0,A,120,120,t2) ,new Pie(0,0,A,240,120,t3)}; Demo(){ setPreferredSize(new Dimension(A+1,A+1)); addMouseListener( new MouseAdapter(){ public void mouseClicked(MouseEvent e){ for(int i=0;i<pies.length;i++){ if(pies[i].content.contains(e.getX(),e.getY())){ pies[i].doAction();break; } } } } ); } void drawPie(Graphics2D g2,Pie pie){/*上記に同じ*/} public void paintComponent(Graphics g) {/*上記に同じ*/} public static void main(String[] args){/*上記に同じ*/} }

pulis
質問者

お礼

2度に渡る回答ありがとうございました。 大変参考になりました。

関連するQ&A