Avatar billede conrad Nybegynder
16. oktober 2001 - 12:35 Der er 1 kommentar og
2 løsninger

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();   
    }
}



Avatar billede disky Nybegynder
16. oktober 2001 - 12:36 #1
prøv at kør alt det med at tegne i sin egen tråd.
Avatar billede logical Nybegynder
16. oktober 2001 - 20:08 #2
Alle event callbacks sker i guitråden, så der er lidt usmart at have for meget funktionalitet i en callback metode. Brug en separat tråd til at udføre arbejdet, og kald opdateringerne således:
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    someGuiThing.update();
  }
});
Avatar billede conrad Nybegynder
21. oktober 2001 - 11:14 #3
Tak for hjælpen.Ideen var god nok,og det hjalp også lidt men problemet blev ikke fjernet fuldstændigt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester