• ベストアンサー
※ 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

  • javaでgraphicsの描画の件

    今日は javaでgraphicsの描画を行っていますが、CENTERのペインには、描画できますが、 それ以外のペイン(NORTH,WEST、EAST,、SOUTH)には、描画できないように思います。 Q1)この件について、コメント頂けますと大変助かります。 下記に、ソースコードを添付いたします。 =================== package pkg; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class SampleApp extends JFrame { public SampleApp(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600, 300); this.add(new GPanel(), BorderLayout.WEST); this.add(new GPanel(), BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); // int w = this.getWidth(); // int h = this.getHeight(); int w=200; int h=200; g.setColor(Color.RED); g.fillOval(0, 0, w/2, h/2); Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(40, 40, w,h)); g.setColor(Color.BLUE); g.setFont(new Font("Serif", Font.BOLD, 36)); g.drawString("Graphics draw!", 10, h - 50); // g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(8.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } }

    • ベストアンサー
    • Java
  •  型Containerのメソッドadd(String ,Compone

     型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。  今晩は、java初心者です、エラーの意味が理解出来ません、宜しくお願い致します。  《A》というプログラムと《B》というプログラムで、クラスを「class MyPanel extends JPanel」と「class JPanel」に変えただけで、「型Containerのメソッドadd(String ,Component)は引数(JPanel ,String)に適用できません。」というエラーがでます。  一体何が原因でしょうか。  JPanelを継承したクラス(MyPanel)を呼び出すのか、そのまま、JPanelクラスを呼び出すのかの違いだけで、内容的には何も変わるところがないはずだと思うのですが。  意味が理解出来ません。 ======================================================================== 《A》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class MyPanel extends JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } ============================================================ 《B》 public class Sample extends JFrame { Sample() { this.setSize(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); this.add(panel , BorderLayout.CENTER); this.setVisible(true); } public static void main(String[] args) { new Sample(); } } class JPanel { public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillOval(50,50,100,100); } } =======================================================================

    • ベストアンサー
    • Java
  • メモリやCPU使用率が高すぎる?

    Java 1.6で動作するアナログ時計のようなものを作っていて、 一応動作はするのですが、メモリやCPUの使用率が常駐に向かない程度まで高くなってしまいます。 具体的には、メモリが100MB前後、CPUが10%前後で安定しています。 増え続ける様子はないのですが Intel Core i7 の10%はかなりの割合です。 ここに書いているソースが全てではないのですが、大きな間違いや代替案等ありましたら教えていただけるとありがたいです。 Jpanel に 盤面、長針、短針、秒針 を描画するのが主な構造です。 秒針はスムーズに廻るタイプなので概ね30FPS程度の間隔で repaint() を呼んでいます。 アニメーションは専用のスレッドを使い、次のようにしています。 while(true){ try{Thread.sleep(sleepTime);}catch(InterruptedException ie){} SwingUtilities.invokeLater(new Runnable(){ public void run(){ paintPane.repaint(); } }); } JPanelのpaintComponentは次のとおりです @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.scale(scale, scale); //shorthand.draw(g)などの描画処理 g2d.dispose(); 針の描画はこちらです。 public void draw(Graphics g){ angle=(角度の算出処理) Graphics2D g2d = (Graphics2D) g.create(); AffineTransform oldtr = ((Graphics2D)g).getTransform(); g2d.translate(this.posX - this.axisX, this.posY - this.axisY); g2d.rotate(Math.toRadians(angle), this.axisX, this.axisY; g2d.drawImage(this.image, 0, 0, null); g2d.setTransform(oldtr); g2d.dispose(); } 時計の針専用のクラスを用意し、針の画像、アングル、位置などの情報をもたせています。 全体のサイズは300x300ピクセル前後です。

    • ベストアンサー
    • Java
  • createImage()を使いコンパイル

    このプログラムをcreateImage()を使ってイメージを作りたいのですが自分で変更してもコンパイルできません><;どのように変更したらイメージをつくることができるのでしょうか?回答よろしくおねがいしまあす(^^; import java.awt.Color; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; class Test extends JComponent implements MouseMotionListener { public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new Test()); frame.setBounds(0 , 0 , 400 , 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); } Image image; public Test() { addMouseMotionListener(this); image = new BufferedImage(400, 300, BufferedImage.TYPE INT RGB); Graphics g = image.getGraphics(); g.setColor(new Color(0xFF, 0xFF, 0xFF)); g.fillRect(0, 0, 400, 300); }public void paintComponent(Graphics g) { g.drawImage(image, 0, 0, this); } public void mouseDragged(MouseEvent e) { Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0)); g.fillOval(e.getX() - 5, e.getY() - 5, 5 , 5); repaint(); }public void mouseMoved(MouseEvent e) {} }

  • createImage()を使い コンパイル

    このプログラムをcreateImage()を使ってイメージを作りたいのですが自分で変更してもコンパイルできません><;どのように変更したらイメージをつくることができるのでしょうか?回答よろしくおねがいしまあす(^^; import java.awt.Color; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; class Test extends JComponent implements MouseMotionListener { public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new Test()); frame.setBounds(0 , 0 , 400 , 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); } Image image; public Test() { addMouseMotionListener(this); image = new BufferedImage(400, 300, BufferedImage.TYPE INT RGB); Graphics g = image.getGraphics(); g.setColor(new Color(0xFF, 0xFF, 0xFF)); g.fillRect(0, 0, 400, 300); }public void paintComponent(Graphics g) { g.drawImage(image, 0, 0, this); } public void mouseDragged(MouseEvent e) { Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0)); g.fillOval(e.getX() - 5, e.getY() - 5, 5 , 5); repaint(); }public void mouseMoved(MouseEvent e) {} }

  • 上に色をつけるJPanelを作りたい

    つい先日も質問させていただきましたが、また分からないことがでてきたのでお聞きします。 JPanelのなかにOverlayLayoutで2枚のJPanel(上にglassPane、下にcontentPane)を配置し、overがtrueになったらglassPaneに色を書くようにしたいと思っています。 ですが、下のcontentPane部分にボタンなどがあると、その部分にうまく色がつきません。 どうすればいいのでしょうか。よろしくお願いします。 自分で組んでみたコードを示します。 ****** import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JLabel{ private JPanel glassPane; private JPanel contentPane = new JPanel(); private JButton button1 = new JButton("OverlayTest"); private boolean over = false; public Test(){ glassPane = new JPanel(){ @Override protected void paintComponent(final Graphics g) { super.paintComponent(g); if(!over)return; Graphics2D g2 = (Graphics2D) g; g2.setColor(new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue(), 150)); g2.fillRect(0, 0, this.getWidth(), this.getHeight()); } }; button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setOver(!over); glassPane.repaint(); //glassPane.revalidate(); } }); contentPane.setLayout(new GridBagLayout()); contentPane.add(button1); glassPane.setOpaque(false); setLayout(new OverlayLayout(this)); add(glassPane); add(contentPane); } public void setOver(boolean over){ this.over = over; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new Test()); frame.setSize(500,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaの描画の取り消し(消去)に関する質問

    毎度、お世話になります。 Q1)下記は、描画のサブルーチンですが、この中で、3個の描画(各々、A,B,C)を 行なっていますが、この内の1この描画(例えば、C)を取り消す事は可能ですか? static void drawCanvas_sub(Graphics2D g2){ BasicStroke wideStroke = new BasicStroke(3.0f); BasicStroke normalStroke = new BasicStroke(1.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 140.0d)); //A ********* g2.setStroke(normalStroke); g2.drawLine(0,100,520,100); //B *********** g2.drawRect(0, 0, 520, 380); //C ********** } 以上

    • ベストアンサー
    • Java
  • 初心者です。 コンパイルのエラー

    import java.awt.*; import javax.swing.*; public class R11Sample1 extends JFrame { Rect r1 = new Rect(Color.red, 100, 100, 80, 60); Rect r2 = new Rect(new Color (0.5f, 1f, 0f, 0.7f), 150, 120, 60, 90); Oval = new Oval(Color.blue, 60, 50, 10, 10); JPanel panel = new JPanel() { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; r1.draw(g2); r2.draw(g2); } }; public R11Sample1() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(panel); } public static void main(String[] args) { new R11Sample1().setVisible (true); } } class Rect { Paint pat; int xpos, ypos, width, height; public Rect(Paint p, int x, int y, int w, int h) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillRect(xpos-width/2, ypos-height/2, width, height); } } class Oval { Paint pat; int xpos, ypos, radius; public Oval(Paint p, int x, int y, int width, int height) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillOval(xpos-width/2, ypos-height/2, width, height); } } これでコンパイルすると、 Identifierがありません といわれました。 どこを直せばいいのでしょうか。 また、全体的に間違ったところがあったら教えてください。

    • ベストアンサー
    • Java
  • javaのCanvasを使用する描画

    今日は! repaintからCanvasの中のpaintルーチンを起動して描画を行なっています。 (下記のプログラム参照) ボタンを押すごとに、キャンバスに違った内容の書込みを行ないます。 painルーチンが起動する度に、既に書込んだキャンバスの内容がクリヤーされて 新規にキャンバスに書込みが行われて居ると思います。 Q1)キャンバスの内容をクリヤーすることなく、既に書込んだキャンバスの内容を 残して、その上に書込む方法はありませんか? (クリヤーのための指令は、出していないと思っています) ご教授の程、宜しくお願いします。 //================================ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class ShapeTest1 extends JFrame{ int sw=0; myCanvasPanel myCanvas; public static void main(String[] args){ // JFrame frame = new JFrame(); ShapeTest1 frame=new ShapeTest1(); } ShapeTest1(){ JFrame frame=new JFrame(); // ShapeTest1 app = new ShapeTest1(); // frame.getContentPane().add(app); frame.setTitle("タイトル"); frame.setBounds(10, 10, 300,220); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame.setVisible(true); //North========================= JPanel p1=new JPanel(); myCtlPanel myCtl=new myCtlPanel(p1) ; // frame.getContentPane().add(p1,BorderLayout.SOUTH); frame.getContentPane().add(p1,BorderLayout.NORTH); //===================================== JPanel p2=new JPanel(); myCanvas=new myCanvasPanel(p2); p2.add(myCanvas); frame.getContentPane().add(p2,BorderLayout.CENTER); frame.setVisible(true); } //=========================== class myCtlPanel extends JFrame{ myCtlPanel(JPanel p){ /* //領域のサイズ設定 setSize(300,50); //領域のサイズ取得 Dimension dimension = getSize(); */ Button button1=new Button("button1"); button1.addActionListener(new TimButton1()); p.add(button1); } } class TimButton1 implements ActionListener{ @Override public void actionPerformed(ActionEvent ae){ if(sw==0){ sw=1; } else{ sw=0; } myCanvas.repaint(); //ng System.out.println("TimButton1 sw="+sw); } } class myCanvasPanel extends Canvas{ myCanvasPanel(JPanel p){ //領域のサイズ設定 setSize(300,150); //領域のサイズ取得 Dimension dimension = getSize(); // p.add(this); } // public void paintComponent(Graphics g){ //repaint()では、起動されない public void paint(Graphics g){ //repaint()では、起動 Graphics2D g2 = (Graphics2D)g; System.out.println("Paint sw="+sw); if(sw==0){ //================================================ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); //============================================== g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(4.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } else{ g2.setPaint(Color.RED); BasicStroke wideStroke = new BasicStroke(4.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 140.0d)); } } } }

    • ベストアンサー
    • Java
  • いきなりなのですが、JavaのJDesktoppaneの上にGraph

    いきなりなのですが、JavaのJDesktoppaneの上にGraphicsで円やラインを描画することはできるでしょうか? というのも、現在Javaでマインドマップ作成ツールを開発しており、JDesktoppaneの上にJPanelやJInternalFrameを 表示させることで、マインドマップの葉の追加や葉に対するテキストの変更を行っているのですが、葉同士をつなぐ ラインを描画しようとしたところ、うまく描画することができませんでした。 ソースコード自体は以下のような感じでやろうと考えています。 panel = new JDesktopPane(); this.getContentPane().add(panel); g = panel.getGraphics(); g.setColor(Color.RED); g.drawLine(10, 10, 120, 40); panel.add(new CubeMindmapLeaf()); //ルートの葉を作成 しかし、マインドマップの葉自体はうまく表示できるのですが、ラインがうまく表示されません。 どなたかお分かりになる方がいらっしゃいましたら、ご回答のほどよろしくお願いします。

    • ベストアンサー
    • Java