langsom mouselistener
Vi er igang med at lave et tegneprogram. Problemet ligger i vores MouseListener der ikke fanger alle click på Canvas\'et. Kan der gøres noget for at speede den op ? hvis man trykker stille og roligt er det ikke et problem, men det er ikke helt tilfredsstillende hvis man laver et par hurtige tryk.Vi har et JPanel med to knapper (linie eller firkant) og en canvas liggende på en JFrame.
Draw.java :
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color.*;
import java.lang.Math;
public class Draw extends JFrame implements MouseListener,ActionListener
{
int SEL = 0;
int LINE = 1;
int SQUARE = 2;
Point2D p[] = new Point2D [3];
Canvas can;
JPanel pan;
Line2D.Double line;
Rectangle2D.Double square;
Graphics2D g2d;
JButton but1,but2;
Draw()
{
super(\"hej\");
setSize(400,400);
getContentPane().setLayout(new GridBagLayout());
pan = new JPanel();
pan.setSize(50,400);
//pan.addMouseListener(this);
but1 = new JButton(\"Line\");
but2 = new JButton(\"Square\");
pan.add(but1);
pan.add(but2);
//but1.addMouseListener(this);
//but2.addMouseListener(this);
but1.addActionListener(this);
but2.addActionListener(this);
can = new Canvas();
can.setSize(350,400);
can.setBackground(Color.white);
can.addMouseListener(this);
//can.addActionListener(this);
getContentPane().add(pan);
getContentPane().add(can);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
int i;
if(e.getSource() == but1)
{
SEL = LINE;
for (i = 0; i<p.length; i++)
{
p[i] = null;
}
System.out.println(\"pan pressed\");
}
if (e.getSource() == but2)
{
SEL = SQUARE;
for (i = 0; i<p.length; i++)
{
p[i] = null;
}
System.out.println(\"pan pressed\");
}
}
public void mouseClicked(MouseEvent e)
{
System.out.println(\"MouseListener\");
int i;
if(e.getSource() == can && SEL == LINE)
{
if(p[0] != null)
{
System.out.println(\"can pressed 1\");
line = new Line2D.Double(p[0].getX(),p[0].getY(), e.getX(), e.getY());
g2d = (Graphics2D)can.getGraphics();
g2d.draw(line);
for (i = 0; i<p.length; i++)
{
p[i] = null;
}
}
else
{
p[0] = new Point2D.Double(e.getX(),e.getY());
}
}
else if(e.getSource() == can && SEL == SQUARE)
{
if(p[0] != null)
{
System.out.println(\"can pressed 2\");
square = new Rectangle2D.Double(p[0].getX(),p[0].getY(), Math.abs(e.getX()-p[0].getX()), Math.abs(p[0].getY()-e.getY()));
g2d = (Graphics2D)can.getGraphics();
g2d.draw(square);
for (i = 0; i<p.length; i++)
{
p[i] = null;
}
}
else
{
p[0] = new Point2D.Double(e.getX(),e.getY());
}
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public static void main(String args[])
{
Draw d = new Draw();
}
}
