1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. 1sanek1

    1sanek1 Гость

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

    код Java
    Код:
     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
    Код:
     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
    Java Team

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

    1sanek1 Гость

    Репутация:
    0
    Да, согласен, но если инициалиировать раньше, например в конструкторе 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
    Java Team

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

    1sanek1 Гость

    Репутация:
    0
    ошибка видемо не в этом, переписал код так:
    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 Гость

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

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