0

私の質問は、ユーザーに線を引くことを許可するというJavaチャレンジでほのめかされていますが、マウスをクリックしてドラッグしたときにアプリケーションに線が表示されないため、まだ問題があります。

この質問に答えることは、ほとんどの初心者プログラマーがグラフィックスクラスと描画をよりよく理解するのに間違いなく役立ちます。これは、特に初心者にとって、しばしば複雑なプロセスです。

私が使用しているテキストによると(私は自分でJavaを学んでいるので)、これはJavaを使用して線を引く方法の例でした。

/*
 * LineTest
 * Demonstrates drawing lines
 */

import java.awt.*;
public class LineTest extends Canvas {

public LineTest() {
    super();
    setSize(300, 200);
    setBackground(Color.white);
}

public static void main(String args[]) {
    LineTest lt = new LineTest();
    GUIFrame frame = new GUIFrame("Line Test");
    frame.add(lt);
    frame.pack();
    frame.setVisible(true);
}

public void paint(Graphics g) {
    g.drawLine(10, 10, 50, 100);
    g.setColor(Color.blue);
    g.drawLine(60, 110, 275, 50);
    g.setColor(Color.red);
    g.drawLine(50, 50, 300, 200);
}
}

仕様は次のとおりです。

Create an application that allows you to draw lines by clicking the initial 
point and draggingthe mouse to the second point. The application should be 
repainted so that you can see the line changing size and position as you
are dragging the mouse. When the mouse button is eleased, the line is drawn.

ご存知のように、このプログラムを実行しても、ユーザーによる図面は作成されません。このエラーは、mouseReleasedメソッドがないために発生したと思います。

どんな助けでも大歓迎です。何卒よろしくお願い申し上げます。

質問に答えるための私のコードは次のとおりです。

import java.awt.*;
import java.awt.event.*;

public class LineDrawer2 extends Canvas {

    int x1, y1, x2, y2;

      public LineDrawer2() {
          super();
    setSize(300,200);
    setBackground(Color.white);
      }

public void mousePressed(MouseEvent me) {
          int x1 = me.getX();
    int y1 = me.getY();
          x2 = x1;
    y2 = y1;
    repaint();
}

      public void mouseDragged(MouseEvent me) {
    int x2 = me.getX();
    int y2 = me.getY();
    repaint();
}

public void mouseReleased(MouseEvent me) {
}

      public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.blue);
          g.drawLine(x1, y1, x2, y2);
}

public static void main(String args[]) {
    LineDrawer2 ld2 = new LineDrawer2();
    GUIFrame frame = new GUIFrame("Line Drawer");
    frame.add(ld2);
    frame.pack();
    frame.setVisible(true);
}

public void mouseMoved(MouseEvent me) {
}
public void mouseClicked(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
}

}

PS:前回の返信から、これは古い形式であることがわかりましたが、可能であれば古い形式を使用してお知らせください。新しい形式も必ず学習します。心より感謝申し上げます。

4

1 に答える 1

1

イベント処理メソッドのフィールドを初期化する代わりに、ローカル変数を初期化しています。それ以外の

int x2 = me.getX();
int y2 = me.getY();

そのはず

this.x2 = me.getX();
this.y2 = me.getY();

または単に

x2 = me.getX();
y2 = me.getY();

編集:

もう1つの問題は、クラスにmousePressed()、mouseDragged()などのメソッドがある場合でも、MouseListenerとMouseMotionListenerが実装されていないことです。そして最後に、そのようなリスナーをそれ自体に追加することはありません。したがって、コードは次のように変更する必要があります。

public class LineDrawer2 extends Canvas implements MouseListener, MouseMotionListener {
    ...
    public LineDrawer2() {
        ...
        addMouseListener(this);
        addMouseMotionListener(this);
    }

私のアドバイス:クラスにメソッドを追加するたびに(のようにmousePressed())、このメソッドはクラスまたはインターフェイスのメソッドをオーバーライドすることになっているので、それに注釈を付けます@Override。そうすれば、メソッドが実際にどのメソッドもオーバーライドしない場合、コンパイラーはコンパイルエラーを生成します。

@Override
public void mousePressed(MouseEvent e) {

}
于 2012-12-30T16:57:25.760 に答える