Java Challenge относно разрешаването на потребителя да начертае линия, част 2

Въпросът ми беше споменат в Java Challenge на Разрешаването на потребителя да начертае линия обаче все още изпитвам затруднения, тъй като в приложението ми не се появява линия, когато се щракне и плъзне мишката.

Отговорът на този въпрос определено би помогнал на повечето начинаещи програмисти да разберат по-добре графичния клас и чертането, често сложен процес, особено за начинаещи.

Според текста, който използвам (тъй като уча 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