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

  • Автор темы 1sanek1
  • Дата начала
1

1sanek1

Гость
#1
У меня возникла проблема, немогу найти ошибку.
В моем коде апплет, создаёт объект класса 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."); 
} 
}


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

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#2
инициализации msgPoint производится только в mouseMoved. С чего ты взял что этот метод будет вызван до paint?
 
1

1sanek1

Гость
#3
Да, согласен, но если инициалиировать раньше, например в конструкторе 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"; поставить на строчку вышу , всё нармально выводит)

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

1sanek1

Гость
#5
ошибка видемо не в этом, переписал код так:
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))
Та же ошибка
 
1

1sanek1

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