отслеживание событий

Тема в разделе "Java", создана пользователем 1sanek1, 30 окт 2008.

  1. 1sanek1

    1sanek1 Гость

    У меня возникла проблема, немогу найти ошибку.
    В моем коде апплет, создаёт объект класса SampleFrame, конструктор имеет 2 аргумента: массив с координатами и массив с коментарием. Алагаритм такой:
    1)Сначало координаты и коментарии, записываю в хэш таблицу (HashMap pointSet = new HashMap(); )
    2)Затем в каждый момент времени отслеживаем координаты курсора(используем интерфес MouseMotionListener и метод mouseMoved(MouseEvent me)) и сравниваем с координатами точек, запианных в хэш таблице, если координаты совпадают, то выводим коментарий данной точки.
    3)В методе paint рисуется график по координатам точек.
    Вот код программы:

    код Java
    Код (Text):
     import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.awt.geom.*;
    /*
    <applet code="dfdg!" width=450 height=700>
    </applet>
    */
    class SampleFrame extends Frame implements MouseMotionListener
    {
    Object koment[];
    Object koordinat[];
    String msg="";
    int mouseX, mouseY;
    HashMap pointSet = new HashMap();
    Point msgPoint;
    Point2D p;  
    SampleFrame(String title, Object koment[], Object koordinat[])
    {

    super(title);
    addMouseMotionListener(this);
    MyWindowAdapter adapter = new MyWindowAdapter(this);
    addWindowListener(adapter);

    this.koment = koment;
    this.koordinat = koordinat;
    double x,y;
    int t=0,n=1;
    for(int i=0; i<koordinat.length; i+=2)
    {
    x = (Double)koordinat[i];
    y = (Double)koordinat[i+1];
    p = new Point2D.Double((int)x,(int)y);
    pointSet.put(p, "Tochka: "+n+". "+koment[t]);
    t++;n++;
    }
    }

    public void paint(Graphics g)
    {
    g.drawLine(10, 50, 10, 900);
    g.drawLine(10, 900, 1100, 900);
    g.drawLine(10, 50, 5, 55);
    g.drawLine(10, 50, 15, 55);
    g.drawLine(1100, 900, 1095, 895);
    g.drawLine(1100, 900, 1095, 905);
    g.drawString("x",1100,900);
    g.drawString("y", 10, 50);

    g.drawString(msg, msgPoint.x, msgPoint.y); // здесь возникают последствии ошибки!!!

    Color c1 = new Color(187, 193, 188);
    Color c2 = new Color(0, 0, 0);
    double a=0,b=0,c=0,d=0,a1=0,b1=0;
    int x=0,y=0,t=1;
    for(int i=0; i<=koordinat.length; i += 2)
    {       if(i!=0)
    {
    if(t%2==0)
    {
    g.setColor(c1);
    a1 = (Double)koordinat[x];
    b1 = (Double)koordinat[i];
    g.fillRect(10+(int)a1, 50, (int)b1-(int)a1, 900);
    g.setColor(c2);
    }
    a = (Double)koordinat[x];
    b = (Double)koordinat[y];
    c = (Double)koordinat[i];
    d = (Double)koordinat[i+1];
    g.drawLine(10+(int)a, 900-(int)b, 10+(int)c, 900-(int)d);          
    t++;
    }
    x=i; y=i+1;
    }
    }

    public void mouseDragged(MouseEvent me)
    {
    throw new UnsupportedOperationException("Not supported yet.");
    }

    public void mouseMoved(MouseEvent me) //Здесь возникает ошибка!!!!!!!!!!!
    {
    Point p = new Point(me.getX(), me.getY());

    if(pointSet.containsKey(p))
    {
    msg = (String)pointSet.get(p);

    msgPoint = p;
    repaint();
    }
    else
    {
    msg="";
    repaint();
    }
    }
    }

    class MyWindowAdapter extends WindowAdapter
    {
    SampleFrame sampleFrame;
    public MyWindowAdapter(SampleFrame sampleFrame)
    {
    this.sampleFrame = sampleFrame;
    }
    public void windowClosing(WindowEvent we)
    {
    sampleFrame.setVisible(false);
    }
    }

    public class Proverka extends Applet
    {
    SampleFrame objGr;
    public void init()
    {
    Object koment[] = new Object[4];
    Object koordinat[] = new Object[8];
    koment[0]="Privet";
    koment[1]="Privet";
    koment[2]="Privet ti kto";
    koment[3]="Hello";
    koordinat[0]=0.;
    koordinat[1]=0.;
    koordinat[2]=10.;
    koordinat[3]=40.;
    koordinat[4]=20.;
    koordinat[5]=20.;
    koordinat[6]=30.;
    koordinat[7]=80.;
    objGr = new SampleFrame("Graphics", koment, koordinat);
    objGr.setSize(1200, 950);
    objGr.setVisible(true);
    }
    public void start()
    {
    objGr.setVisible(true);
    }
    public void stop()
    {
    objGr.setVisible(false);
    }
    }

    Я так понимаю, что ошибка возникает в методе mouseMoved, но из-за чего не пойму.
    Вот, повторяющиеся, возникающие ошибки(после запуска апплета):
    C:\Program Files\Java\jdk1.6.0_05\bin>appletviewer grsf1.html
    Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at SampleFrame.paint(Proverka.java:63)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
    at sun.awt.RepaintArea.paint(RepaintArea.java:224)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:301)
    at java.awt.Component.dispatchEventImpl(Component.java:4489)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Window.dispatchEventImpl(Window.java:2440)
    at java.awt.Component.dispatchEvent(Component.java:4243)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at SampleFrame.paint(Proverka.java:63)
    at java.awt.Container.update(Container.java:1818)
    at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239)
    at sun.awt.RepaintArea.paint(RepaintArea.java:216)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:301)
    at java.awt.Component.dispatchEventImpl(Component.java:4489)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Window.dispatchEventImpl(Window.java:2440)
    at java.awt.Component.dispatchEvent(Component.java:4243)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    Причем, что интересно, у меня есть аналогичная программа(тот кусок где возникает ошибка), только работающая, вот и этот момент меня ставит в тупик , вот её код:

    код Java
    Код (Text):
     import java.awt.*;
    import java.awt.event.*;
    import java.util.*;

    class Sample extends Frame implements MouseMotionListener {
    String msg = "";
    Point msgPoint;
    Set<Point> pointSet = new HashSet<Point>();

    public Sample() {
    addMouseMotionListener(this);
    addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent we) {
    System.exit(0);
    }
    });

    pointSet.add(new Point(10, 50));
    pointSet.add(new Point(10, 90));
    pointSet.add(new Point(110, 90));
    }

    @Override
    public void paint(Graphics g) {
    g.drawLine(10, 50, 10, 90);
    g.drawLine(10, 90, 110, 90);
    g.drawLine(10, 50, 5, 55);
    g.drawLine(10, 50, 15, 55);
    g.drawLine(110, 90, 100, 90);
    g.drawLine(110, 90, 100, 90);
    if (msgPoint != null) {
    g.drawString(msg, msgPoint.x, msgPoint.y);
    }
    }

    @Override
    public void mouseMoved(MouseEvent me) {
    Point p = new Point(me.getX(), me.getY());
    if (pointSet.contains(p)) {
    msg = "privet drug";
    msgPoint = p;
    repaint();
    } else {
    msg = "p: " + p.x + " " + p.y;
    msgPoint = p;
    repaint();
    }
    }

    public static void main(String args[]) {
    Sample f = new Sample();
    f.setSize(new Dimension(300, 200));
    f.setTitle("Okno");
    f.setVisible(true);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet.");
    }
    }


    Если, кот нибуть знает в чём тут дело, помогите, заранее спасибо!
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    инициализации msgPoint производится только в mouseMoved. С чего ты взял что этот метод будет вызван до paint?
     
  3. 1sanek1

    1sanek1 Гость

    Да, согласен, но если инициалиировать раньше, например в конструкторе msgPoint = new Point(300, 400);(или сделать так //g.drawString(msg, msgPoint.x, msgPoint.y):), ошибка всё равно возникает(проверил). Причем я думаю ошибка возникает в строке if(pointSet.containsKey(p)), только я не знаю почему.
    (я проверил это так: присвоил строку переменной, например str1 и сразу перерисовыва, c помощью repaint()( if(pointSet.containsKey(p)){str1 = "Privet";repaint();}), и прописывал её в Paint(g.drawString(str1, msgPoint.x, msgPoint.y);). На эране надписи не появилось, а если str1="Privet"; поставить на строчку вышу , всё нармально выводит)

    Причем в хэш таблицу данные записывабтся коректно, я это проверил.
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
     
  5. 1sanek1

    1sanek1 Гость

    ошибка видемо не в этом, переписал код так:
    Point p;


    p = new Point((int)x,(int)y);
    pointSet.put(p, "Tochka: "+n+". "+koment[t]);

    Point l = new Point(me.getX(), me.getY());
    if(pointSet.containsKey(l))
    Та же ошибка
     
  6. 1sanek1

    1sanek1 Гость

    Спасибо за помощь, нашёл ошибку. :) Дело в том, что я забыл, когда запиывал координаты в хэш таблицу, произвести над нимими не хитрые мунипуляции:
    p = new Point((int)x+10,900-(int)y);
    тоесть всё работало, только точки сравнивал не те, эх невнимательность. :(
    Правдо, ещё в методе Peint, в конце, почему то подвисает, тоесть если в конец метода поставит g.drawString("Privet "+i,50+i*5,150+i*5);, то надписи привет, мы не увидим, щас буду искать в чём тут дело.
     
Загрузка...

Поделиться этой страницей