• ベストアンサー

内部クラスにする方法教えてください!

import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Line extends JPanel { int x0, y0, x1, y1; public static class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static class ClickTracker extends MouseAdapter { private Line line; public ClickTracker(Line enclosing) { line = enclosing; } public void mouseClicked(MouseEvent e) { line.x0 = line.x1; line.y0 = line.y1; line.x1 = e.getX(); // MouseEventクラスのgetXメソッドでマウスのx座標値を取得 line.y1 = e.getY(); // MouseEventクラスのgetYメソッドでマウスのx座標値を取得 line.repaint(); // ウィンドウの表示を再描画 } } public Line() { x0 = y0 = x1 = y1 = 0; addMouseListener(new ClickTracker(this)); JFrame frame = new JFrame(); frame.addWindowListener(new WindowCloser()); frame.getContentPane().add(this); frame.setSize(300,300); frame.setVisible(true); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine(x0, y0, x1, y1); } public static void main(String[] args) { Line c = new Line(); } } 上のプログラムのClickTrackerクラスを内部クラスに書き換えたいんですけどどなたか教えてください!

  • Java
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • world99
  • ベストアンサー率64% (20/31)
回答No.2

そもそもClickTrackerクラスは内部クラスではないでしょうか? ご要望とは、違いますが、次の箇所を精査してみました。 1.WindowCloser内部クラスの匿名クラス化。 2.ClickTrakerクラスをLineクラスのimplementsにする。 ご参考までにどうぞ。 以下、書き換えたプログラムになります。 -------------------------------------------------- import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Line extends JPanel implements MouseListener { int x0, y0, x1, y1; // public static class WindowCloser extends WindowAdapter { // public void windowClosing(WindowEvent e) { // System.exit(0); // } // } // // public static class ClickTracker extends MouseAdapter { // private Line line; // // public ClickTracker(Line enclosing) { // line = enclosing; // } // // public void mouseClicked(MouseEvent e) { // line.x0 = line.x1; // line.y0 = line.y1; // line.x1 = e.getX(); // MouseEventクラスのgetXメソッドでマウスのx座標値を取得 // line.y1 = e.getY(); // MouseEventクラスのgetYメソッドでマウスのx座標値を取得 // line.repaint(); // ウィンドウの表示を再描画 // // } // } public Line() { x0 = y0 = x1 = y1 = 0; // addMouseListener(new ClickTracker(this)); addMouseListener(this); // implementsしたMouseListenerを追加 JFrame frame = new JFrame(); // frame.addWindowListener(new WindowCloser()); frame.addWindowListener(new WindowAdapter() { // 匿名クラスを追加 public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add(this); frame.setSize(300, 300); frame.setVisible(true); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine(x0, y0, x1, y1); } public static void main(String[] args) { Line c = new Line(); } // ClickTrackerクラスの処理を実装 public void mouseClicked(MouseEvent e) { x0 = x1; y0 = y1; x1 = e.getX(); // MouseEventクラスのgetXメソッドでマウスのx座標値を取得 y1 = e.getY(); // MouseEventクラスのgetYメソッドでマウスのx座標値を取得 repaint(); // ウィンドウの表示を再描画 } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} }

その他の回答 (1)

回答No.1
参考URL:
http://www.javaroad.jp/java_class15.htm

関連するQ&A

  • MouseEventおよびMouseListenerについて、、

    JAVAの初心者です。。 ただいまMouseEventおよびMouseListenerをもちいて、 とある画像でMouseを用いた距離の測定を行うプログラムを作成中なのですが、、 public void run(){ addMouseListener(this) } public void mouseClicked(MouseEvent e){} public void mousePressed(MouseEvent e){ int x1 = e.getX(); int y1 = e.getY(); } public void mouseReleased(MouseEvent e){ int x2 = e.getX(); int y2 = e.getY(); Line = Math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); } public void mouseEntered(MouseEvent e){] public void mouseExites(MouseEvent e){} プログラムとしてはプレスとリリースで直線距離を測定し、 その後、その距離を用いて他の計算を行うものなのですが、 mouseReleased時にgetX()メソッドをもちいて測定した距離(変数Line)を他のクラスに継承させたいのですがうまくいかないのです。 mouseReleasedメソッドにSystem.out.println(Line)を加えると確かに期待通りの値が出るのですが、 return Line;ではMouseEventメソッドにvoidをつけなければならないために不具合が生じてしまいます。 この変数Lineを他のクラスで使用する場合どのようにすればよいでしょうか、ご指導おねがいします。 また、もう一つの問題点として、このMouseEventを一度起動させると何度マウスを動かしても何度も処理をおこなってしまいます。このMouseEventの終了(可能ならばmouseReleased時に終了)させるためにはどのようなメソッドを加える必要があるでしょうか?? あわせてご教授願います。。

    • ベストアンサー
    • Java
  • クラスメソッドのみのクラスのオブジェクト生成は不可??

    あるテキストのjavaの問題です。 public class Draw{   static void pixel(int x,int y){     /*座標(x、y)に点を描画*/   }   static void line(int x1,int y1,int x2,int y2){     /*座標(x1、y1)~(x2、y2)に線を引く*/   } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){   Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){   Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?

    • ベストアンサー
    • Java
  • MouseEventを使った時間計測について

    これまでJavaは使ったことないのですが、卒研で使うことになり今必死になってやっております。 早速ですが、今drawLineメソッドとMouseEventを使って自由曲線を描くものを作ってみました。 これに、mousePressed時に時間計測を開始し、mouseReleased時に一旦停止。 そして、それを足し合わせて合計時間を出したいのですが調べてもよくわかりません。よろしくお願いします。 下記は、現段階ものです。 ・J2SDK1.4.2.15 class DrawPanel extends Panel implements MouseListener,MouseMotionListener { Vector shapes = new Vector(); int x1,y1; public DrawPanel() { setForeground(Color.black); setBackground(Color.white); addMouseMotionListener(this); addMouseListener(this); } public void mousePressed(MouseEvent e) { e.consume(); x1 = e.getX(); y1 = e.getY(); shapes.addElement(new Rectangle(x1,y1,x1,y1)); paint(getGraphics()); } public void mouseDragged(MouseEvent e) { e.consume(); shapes.addElement(new Rectangle(x1,y1,e.getX(),e.getY())); x1 = e.getX(); y1 = e.getY(); paint(getGraphics()); } public void paint(Graphics g) { int number = shapes.size(); for (int i = 0;i < number;i++) { Rectangle data = (Rectangle)shapes.elementAt(i); g.drawLine(data.x,data.y,data.width,data.height); } } }

    • ベストアンサー
    • Java
  • JFrameクラスの挙動に対する推察と質問

    JFrameクラスの挙動に対する推察と質問 現在、プログラムでJFrameクラスを使って,Windowを表示させるアプリをつくっているのですが、repaintがうまく動作しません。 コードで説明させていただきますと、 public class Main{   public static void main(String[] args){     Drow drow ;     drow = new Drow();     drow.createFrame();     drow.repaint();//画面は更新されない   } } public class Drow extends JPanel{   JFrame frame;   static Image jpg;   static int x;   static int y;   public void createFrame()    {     frame = new JFrame();     Drow app = new Drow();     frame.getContentPane().add(app);     frame.getContentPane().add( new Drow() );     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.setBounds(10, 10, 300, 200);     frame.setTitle("タイトル");     frame.setVisible(true);   }   public void paintComponent(Graphics g){     super.paintComponent(g);     g.drawOval(x, y, 80, 80);   } } このソースのMain文でrepaintを実行させているのですが、画面は更新されません。 このエラーについて自分なりに原因を推察した所、JFrameは自分で自分のクラスのインスタンスを作成しているからではないかと考えました。 なので私がrepaintを実行しても、それは私の作ったdrowインスタンスのpaintComponentが実行されているだけで、JFrameが自動でつくったインスタンスの方には影響がないのだと推察しました。 ここで質問なのですが、私の推察はあっているでしょうか? また、このようなrepaintをMain文で実行したい場合はどのようにしたらよいのでしょうか? お返事お待ちしております。

    • ベストアンサー
    • Java
  • またまたすいません、Javaについて質問です

    閲覧ありがとうございます。 現在Javaで簡単なお絵描きソフトを作成しているのですが、ResetButtonを押すと 画面をクリアしたいのですが、ResetButtonを押すと画面はクリアしますが、何故か 左上にResetButtonが描画されてしまいます・・・何故でしょうか? ソースは以下の通りです。(また文字数制限に引っかかったので、一部省略してかいてあります。) import java.awt.event.*; import java.awt.*; import javax.swing.*; /*+++ メインクラス +++*/ public class java_test_04 extends JFrame implements ActionListener { int x1, y1; //描画始点 int x2, y2; //描画次点 MyPanel mp = new MyPanel(); //マイパネルを作成 JButton resetButton = new JButton("Reset"); //リセットボタンを作成 Dimension size; public static void main(String[] args) { new java_test_04(); } public java_test_04() { setLayout(null); setTitle("お絵かき"); //フレームタイトルを設定 setSize(400, 400); //フレームサイズを設定 /*+++ リセットボタンの設定 +++*/ resetButton.setBounds(0, 300, 70, 25); //リセットボタンの表示座標・サイズを設定 resetButton.addActionListener(this); //リセットボタンにアクションイベントを追加 getContentPane().add(resetButton); //リセットボタンを追加 /*+++ マイパネルの設定 +++*/ size = Toolkit. getDefaultToolkit(). getScreenSize(); //フレームのサイズを取得 mp.setBackground(Color.red); //マイパネルの背景色を青に mp.setBounds(0, 0, size.width, 250); //マイパネルの表示座標・サイズを設定 getContentPane().add(mp); //マイパネルを追加 setVisible(true); //フレームを表示 setDefaultCloseOperation(EXIT_ON_CLOSE); //クローズ処理 } @Override public void actionPerformed(ActionEvent arg0) { if (resetButton == arg0.getSource()) { //リセットボタンが押されたら mp.repaint(); //グラフィックをリセット try { Thread.sleep(100); } catch(Exception ex) { System.out.println("[ERR!]" + ex); } } } /*+++ マイパネルクラス +++*/ class MyPanel extends JPanel implements MouseListener,MouseMotionListener{ private static final long serialVersionUID = 1L; MyPanel() { addMouseMotionListener(this); //マウスモーションイベントを追加 addMouseListener(this); //マウスイベントを追加 } /*+++ マウスを押したとき +++*/ public void mousePressed(MouseEvent e) { e.consume(); x1 = x2 = e.getX(); y1 = y2 = e.getY(); paintComponent(getGraphics()); } /*+++ マウスをドラッグしているとき +++*/ public void mouseDragged(MouseEvent e) { e.consume(); x2 = e.getX(); y2 = e.getY(); paintComponent(getGraphics()); //描画 x1 = e.getX(); //これが新たな y1 = e.getY(); //始点となる } /*+++ マウスが動いているとき +++*/ public void mouseMoved(MouseEvent e) { } /*+++ マウスボタンが離されたとき +++*/ public void mouseReleased(MouseEvent e) { } /*+++ マウスがフレーム内に入ったとき +++*/ public void mouseEntered(MouseEvent e) { } /*+++ マウスがフレーム外に出たとき +++*/ public void mouseExited(MouseEvent e) { } /*+++ マウスがクリックされたとき +++*/ public void mouseClicked(MouseEvent e) { } /*+++ ペイントメソッド +++*/ public void paintComponent(Graphics g) { g.drawLine(x1, y1, x2, y2); } } }

    • ベストアンサー
    • Java
  • 【アプレット】マウスイベントについて

    【アプレット】マウスイベントについて 現在、マウスに円をリンクさせています 1回左クリックするとその場所で円が停止し、もう1回左クリックするとまた動きだし、もう1回左クリックするとその場所で円が停止し、・・・の繰り返しを行いたいです なにかアドバイスをください。 作ってるのに近いプログラム ↓ import java.applet.* ; import java.awt.*; import java.awt.event.*; public class test extends Applet { int posX = 50; int posY = 50; public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(posX, posY, 50, 50); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void init () { this.setSize(200, 200); this.setVisible(true); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { posX = e.getX(); posY = e.getY(); repaint(); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void mouseReleased(MouseEvent e){ } public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }); } }

  • ペイントソフトを作っているのですが・・・

    簡単な絵を書くプログラムを下のようにつくりました。 こんなようなソースが公開されているサイトをご存知のかたは教えていただけないでしょうか?? おねがいします!! import java.awt.*; import java.awt.event.*; public class mouse5 extends Frame implements MouseListener , MouseMotionListener{ //グローバル変数 int x0,y0; Color objectColor = Color.red; //コンストラクタ public mouse5(){ setSize(400,300); //マウスイベント addMouseListener(this); addMouseMotionListener(this); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //paint public void paint(Graphics g){ } //マウスが押されたら public void mousePressed(MouseEvent e){ //始点の座標 x0 = e.getX(); y0 = e.getY(); } //マウスが放されたら public void mouseReleased(MouseEvent e){ } //マウスがクリックされたら public void mouseClicked(MouseEvent e){ } //マウスが画面に入ったら public void mouseEntered(MouseEvent e){ } //マウスが画面から出たら public void mouseExited(MouseEvent e){ } //マウスがドラックされたら public void mouseDragged(MouseEvent e){ //線を引く Graphics g = getGraphics(); g.drawLine(x0,y0,e.getX(),e.getY()); g.dispose(); //次のために始点を更新 x0 = e.getX(); y0 = e.getY(); } //マウスが動いたら public void mouseMoved(MouseEvent e){ } //main public static void main(String[] args) { Frame w = new mouse5(); w.show(); } }

    • ベストアンサー
    • Java
  • Javaのマウスイベントについて

    閲覧ありがとうございます、Java初心者です。 現在Javaの勉強をしており、マウスの座標を取得しその座標に座標を描画 するプログラムを作っているのですが、どうしても上手くいきません・・・以下が ソースです↓ import java.awt.*; import java.awt.event.*; public class test01 extends Frame { int x, y; public static void main(String[] args) { new test01(); } test01() { super("FrameTest"); //フレーム名 setSize(300, 300); //サイズを設定 MyCanvas mc = new MyCanvas(); //グラフィック用メソッドをインスタンス化 add(mc); //フレームに描画 addMouseMotionListener(new getMouse_position()); System.out.println("(" + x + "," + y + ")"); setVisible(true); //フレームを表示 addWindowListener(new Close()); //クローズ処理 } /*** グラフィック描画用クラス ***/ public class MyCanvas extends Canvas { public void paint(Graphics g) { g.drawString("(" + x+ "," + y + ")", x, y); } } /*** マウス操作用クラス ***/ public class getMouse_position extends MouseAdapter { public void mouseMoved(MouseEvent ev) { x = getX(); //マウスのx座標を取得 y = getY(); //マウスのy座標を取得 repaint(); } } } /*** クローズ用クラス ***/ class Close extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } これを実行すると、ずっと(0, 0)のままでマウスの座標を読み取ってくれません・・・何故なんで でしょうか?

    • ベストアンサー
    • Java
  • Java 四角を書くツール

    Javaの初心者です。 下のプログラムで(2)のfを(1)のfに対応付けたいのですが、エラーが出てしまいます。 どなたか判る方いらっしゃいましたら教えてください。 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; abstract class Figure { protected int x,y,width,height; protected Color color; public Figure(int x,int y,int w,int h,Color c) { this.x = x; this.y = y; width = w; height = h; color = c; } public void setSize(int w,int h) { width = w; height = h; } public void setLocation(int x,int y) { this.x = x; this.y = y; } abstract public void reshape(int x1,int y1,int x2,int y2); abstract public void paint(Graphics g); } class RectangleFigure extends Figure { public RectangleFigure(int x,int y,int w,int h,Color c) { super(x,y,w,h,c); } public void reshape(int x1,int y1,int x2,int y2) { int newx = Math.min(x1,x2); int newy = Math.min(y1,y2); int neww = Math.abs(x1 - x2); int newh = Math.abs(y1 - y2); setLocation(newx,newy); setSize(neww,newh); } public void paint(Graphics g) { g.setColor(color); g.drawRect(x,y,width,height); } } class DrawApplication { protected Vector<Figure> figures; protected Figure drawingFigure; static Color currentColor; protected DrawPanel drawPanel; public DrawApplication() { figures = new Vector<Figure>(); drawingFigure = null; currentColor = Color.blue; } public void setDrawPanel(DrawPanel c) { drawPanel = c; } public int getNumberOfFigures() { return figures.size(); } public Figure getFigure(int index) { return (Figure)figures.elementAt(index); } public void createFigure(int x,int y) { Figure f = new RectangleFigure(x,y,0,0,currentColor);                 // (1) figures.addElement(f); drawingFigure = f; drawPanel.repaint(); } public void reshapeFigure(int x1,int y1,int x2,int y2) { if (drawingFigure != null) { drawingFigure.reshape(x1,y1,x2,y2); drawPanel.repaint(); } } } class DrawPanel extends JPanel { protected DrawApplication drawApplication; public DrawPanel(DrawApplication app) { setBackground(Color.white); drawApplication = app; drawApplication.setDrawPanel(this); } public void paintComponent(Graphics g) { super.paintComponent(g); for(int i=0; i < drawApplication.getNumberOfFigures(); i++){ f = drawApplication.getFigure(i);           //(2) この部分にエラーが出てしまう f.paint(g); // } } } class DrawMouseListener implements MouseListener,MouseMotionListener { protected DrawApplication drawApplication; protected int dragStartX,dragStartY; public DrawMouseListener(DrawApplication a) { drawApplication = a; } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { dragStartX = e.getX(); dragStartY = e.getY(); drawApplication.createFigure(dragStartX,dragStartY); } public void mouseReleased(MouseEvent e) { drawApplication.reshapeFigure(dragStartX,dragStartY,e.getX(),e.getY()); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { drawApplication.reshapeFigure(dragStartX,dragStartY,e.getX(),e.getY()); } public void mouseMoved(MouseEvent e) { } } class DrawMain { public static void main(String argv[]) { JFrame f = new JFrame("Draw"); ButtonPanel b=new ButtonPanel(); DrawApplication app = new DrawApplication(); JPanel c = new DrawPanel(app); c.addMouseListener(new DrawMouseListener(app)); c.addMouseMotionListener(new DrawMouseListener(app)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(c,BorderLayout.CENTER); f.setSize(400,300); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • Javaマウスイベント 応答速度の改善したい。。

    初心者です。 下記のプログラムを実行すると、 連続してクリックしたときに、何回か応答できない 場合があります。 解決策があるようでしtら、教えてください。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.Toolkit; import java.lang.String; import javax.swing.JFrame; import javax.swing.JPanel; public class jjj extends JFrame { public jjj() { add(new DrawPanel()); } public static void main(String[] A00) { Toolkit.getDefaultToolkit().setDynamicLayout(true); JFrame L00 = new jjj(); L00.setTitle("マウスの座標を表示"); L00.setDefaultCloseOperation(EXIT_ON_CLOSE); L00.setBackground(Color.white); L00.setSize(1920, 1200); L00.setVisible(true); } } class DrawPanel extends JPanel implements MouseListener { int I00 = 10; int I01 = 10; int w = 10; int h = 10; int a = 100; int b = 100; public DrawPanel() { setBackground(Color.white); addMouseListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); String L00 = String.format("(%d, %d)", I00, I01); g.drawString(L00, I00, I01); g.drawLine(0,0,I00, I01); g.drawRect(I00-a/2, I01-b/2, a, b); } public void mouseMoved(MouseEvent A00) { I00 = A00.getX(); I01 = A00.getY(); repaint(); } public void mouseDragged(MouseEvent A00) { I00 = A00.getX(); I01 = A00.getY(); int w = I00; int h = I01; repaint(); } public void mousePressed(MouseEvent A00) { } public void mouseReleased(MouseEvent A00) { } @Override public void mouseClicked(MouseEvent A00) { I00 = A00.getX(); I01 = A00.getY(); repaint(); } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } }

    • ベストアンサー
    • Java

専門家に質問してみよう