Задача Java о разрешении пользователю рисовать линию, часть 2

Мой вопрос упоминался в Java Challenge on Однако, разрешив пользователю рисовать линию, я все еще испытываю трудности, так как в моем приложении не появляется линия при щелчке и перетаскивании мышью.

Ответ на этот вопрос, безусловно, поможет большинству начинающих программистов лучше понять класс графики и рисование, часто сложный процесс, особенно для начинающих.

Согласно тексту, который я использую (поскольку я изучаю 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) {
}

}

P.S.: Из последнего ответа я понял, что это старый формат, однако, если возможно, дайте мне знать, используя старый формат, я обязательно изучу и новый. Я искренне ценю это.


person Community    schedule 30.12.2012    source источник


Ответы (1)


Вы инициализируете локальные переменные вместо инициализации полей в ваших методах обработки событий. Вместо

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

так должно быть

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

или просто

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

РЕДАКТИРОВАТЬ:

Другая проблема заключается в том, что, хотя в вашем классе есть методы 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) {

}
person JB Nizet    schedule 30.12.2012
comment
Большое спасибо за Вашу помощь. Однако даже при этом по какой-то причине моя программа все еще работает неправильно, так как я не вижу рисуемой линии. Мне так жаль беспокоить вас :( - person ; 30.12.2012
comment
Большое спасибо! Это сработало отлично! :) Хорошего дня! Ты восхитителен! - person ; 30.12.2012