Hvorfor ikke sirkelen vises når jeg klikker?

stemmer
1

Jeg må bruke konsollen klasse i HoltSoft er klar til programmet. Jeg er ikke ment å bruke swing, så hvis jeg ikke kan gjøre det uten swing, vennligst ignorere dette.

//imports
import java.awt.*; 
import java.awt.event.*;
import hsa.*;

public class DrawLines extends Panel implements MouseListener, MouseMotionListener
{
    Console c;
    int startX, startY, prevX, prevY; //mouse coordinates
    private boolean dragging; //whether or not the mouse is being dragged
    MouseEvent e;
    public DrawLines ()
    {
        c = new Console (); //creates console window
        addMouseListener (this); //detects press/release
        addMouseMotionListener (this);//detects dragging
    }


    public void mousePressed (MouseEvent e)
    {
        while (!dragging)
        {
            try
            {
                startX = e.getX ();//get the
                startY = e.getY ();//original co-ordinates
                dragging = true;
            }
            catch (NullPointerException q) //because I kept getting this error
            {
            }
        }
    }


    public void mouseDragged (MouseEvent e)
    {
        while (dragging)
        {
            try
            {
                int x = e.getX (); //gets and
                int y = e.getY (); //updates
                prevX = x;         //the mouse
                prevY = y;         //coordinates
            }
            catch (NullPointerException q)//because I kept getting this error
            {
            }
        }
    }


    public void mouseReleased (MouseEvent e)
    {
        dragging = false; //stopped dragging
    }


    public void drawTheLine ()
    {
        mousePressed (e);
        mouseDragged (e);
        c.setColor (Color.black);
        c.fillOval (prevX, prevY, 50, 50); //draws a circle where the mouse is 
        mouseReleased (e);
    }


    public void mouseMoved (MouseEvent e){}
    public void mouseEntered (MouseEvent e){}
    public void mouseExited (MouseEvent e){}
    public void mouseClicked (MouseEvent e){}

    public static void main (String[] args)
    {
        DrawLines a = new DrawLines ();
        a.drawTheLine ();
    }
}

Jeg har prøvd å bruke MouseListener og MouseMotionListener i Console. I begynnelsen holdt programmet gir meg feil, så jeg la den prøve / fangst strukturer. Nå er det ikke krasje, men ingenting vises på skjermen. Hvorfor? Hjelp?

Hvis jeg ikke skal bruke prøve / fangst å bare ignorere det, hva skal jeg gjøre?

Jeg er ikke lov til å bruke noe annet enn Console () for dette programmet. Det er et kurs oppdrag.

Publisert på 03/01/2013 klokken 17:11
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Se på dette:

public void drawTheLine ()
{
    while (true)
    {
        mousePressed (e);
        mouseDragged (e);
        c.setColor (Color.black);
        c.fillOval (prevX, prevY, 50, 50); //draws a circle where the mouse is 
        mouseReleased (e);
    }
}

Parameteren "e" du passerer er null. Det er erklært her:

public class DrawLines extends Panel 
    implements MouseListener, MouseMotionListener
{
    MouseEvent e; // IT IS NEVER SET TO ANYTHING! IT IS NULL!!!

Et sted i konstruktøren bør du gjøre dette så det er ikke lenger null:

e = (something);
Svarte 03/01/2013 kl. 17:19
kilden bruker

stemmer
2

Swing er en hendelse drevet system og er et enkelt system gjenget.

Dette betyr at din søknad "venter" for å oppstå hendelser (som er tatt vare på deg ved hendelses Dispatching Thread), og at alle som blokkerer EDT, som, løkker, lange prosesser som kjører eller blokkering IO, vil hindre deg programmet fra å motta varsling av disse hendelsene, noe som gjør umulig for deg programmet til å kjøre.

Så, hvis vi har en titt på denne ...

    while (true)
    {
        mousePressed (e);
        mouseDragged (e);
        c.setColor (Color.black);
        c.fillOval (prevX, prevY, 50, 50);
        mouseReleased (e);
    }
}

Det tyder på at ... en, trenger du ikke forstår hvordan hendelser blir generert i Swing og to, hvor faktisk fungerer EDT.

I motsetning til enkelte UI rammer, er du ikke pålagt å gjennomføre et arrangement loop, dette er tatt vare på deg ved Swing. Blokkerer EDT som dette, vil hindre at det for behandling av hendelser

I stedet, fjerne drawLineMethodsom det gjør absolutt ingenting for deg og erstatte deg viktigste metoden med noe sånt ...

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception ex) {
            }

            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new DrawLines());
            // I prefer pack, but you've not specified a preferred size for your panel...
            //frame.pack();
            frame.setSize(400, 400);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

Nå. Jeg har ingen anelse om hva Consoleklassen er eller ikke, men i musen hendelses metoder, må du oppdatere den slik at den kan oppdatere det utgang ...

Oppdatert med eksempel

skriv bildebeskrivelse her

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DrawPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DrawPane extends JPanel {

        private Point center;
        private int radius;

        public DrawPane() {
            MouseAdapter handler = new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    center = e.getPoint();
                    radius = 0;
                    repaint();
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    int width = Math.max(e.getX(), center.x) - Math.min(e.getX(), center.x);
                    int height = Math.max(e.getY(), center.y) - Math.min(e.getY(), center.y);
                    radius = Math.max(width, height);
                    repaint();
                }

            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (center != null) {
                g.setColor(Color.RED);
                g.fillOval(center.x - 2, center.y - 2, 4, 4);

                g.drawOval(center.x - (radius / 2), center.y - (radius / 2), radius, radius);

            }
        }
    }
}

Jeg vil foreslå at du tar deg tid til å ha en lese gjennom ...

Oppdatere med en ren AWT versjon

Som det ble påpekt for meg at OP brukte AWT stedet for Swing, hvorfor, fordi de ser ut til å være i stand til ...

public class DrawCircleAWT {

    public static void main(String[] args) {
        new DrawCircleAWT();
    }

    public DrawCircleAWT() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame("Testing");
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
                frame.setLayout(new BorderLayout());
                frame.add(new DrawPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DrawPane extends Panel {

        private Point center;
        private int radius;

        public DrawPane() {
            MouseAdapter handler = new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    center = e.getPoint();
                    radius = 0;
                    repaint();
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    int width = Math.max(e.getX(), center.x) - Math.min(e.getX(), center.x);
                    int height = Math.max(e.getY(), center.y) - Math.min(e.getY(), center.y);
                    radius = Math.max(width, height);
                    repaint();
                }
            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);

            if (center != null) {
                g.setColor(Color.RED);
                g.fillOval(center.x - 2, center.y - 2, 4, 4);

                g.drawOval(center.x - (radius / 2), center.y - (radius / 2), radius, radius);

            }
        }
    }
}
Svarte 03/01/2013 kl. 21:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more