2013-01-03 7 views
1

Мне нужно использовать класс Console в Ready of Program для HoltSoft. Я не должен использовать свинг, поэтому, если я не могу сделать это без качелей, любезно проигнорируйте это.Почему круг не появляется, когда я нажимаю?

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

Я пытался использовать MouseListener и MouseMotionListener в консоли. Сначала программа продолжала давать мне ошибки, поэтому я добавил структуры try/catch. Теперь это не сбой, но на экране ничего не появляется. Зачем? Помогите?

Если я не должен использовать try/catch, чтобы просто игнорировать его, что мне делать?

Мне не разрешено использовать что-либо кроме Console() для этой программы. Это задание на курс.

+7

Когда вы получите исключение это обычно означает, что что-то не так. Простое игнорирование (с пустыми высказываниями) не решает основной проблемы. – assylias

+0

Я не уверен, что такое консоль()? Вы должны использовать 'JPanel' и переопределить' paintComponent' –

+0

Я чувствую, что это использование циклов while довольно опасно ... эта программа завершена? Мне кажется, что существует множество возможностей для бесконечного зависания, например mouseDragged (..) –

ответ

2

Посмотрите на это:

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

Параметр "е" вы передаете равна нулю. Заявлено здесь:

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

Где-то в конструкторе вы должны сделать это так, что это больше не нуль:

e = (something); 
+0

что я могу установить? существуют ли значения для переменной MouseEvent? – ijustdontgetit

+0

@helpmeimdumb Вы не должны использовать объект MouseEvent вообще. Из того, что я вижу, похоже, что java.awt.Point2D подойдет вашим потребностям. – Aaron

+0

«Посмотрите на это» ... В чем это подразумевается? Учитывая тот факт, что они это сделали, возможно, это означает, что они не знают лучше. – MadProgrammer

2

Свинг система приводится событие, и это однопоточный система.

Это означает, что ваше приложение «ждет» событий (которые заботятся о вас по теме Dispatching Thread) и что любой, кто блокирует EDT, например, циклы, длительные процессы или блокирование ввода-вывода, предотвратит ваше приложение получает уведомление об этих событиях, что делает невозможным выполнение вами приложения.

Таким образом, если мы посмотрим на это ...

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

Это свидетельствует о том, что ... один, вы не понимаете, как события генерируются в Swing, и два, как на самом деле работает EDT ,

В отличие от некоторых пользовательских интерфейсов, вам не требуется внедрять цикл событий, это позаботится о вас Swing. Блокирование EDT, как это, будет препятствовать его для обработки событий

Вместо этого удалите drawLineMethod, как это не делает абсолютно ничего для вас и заменить вам основной метод что-то вроде ...

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

Сейчас. Я понятия не имею, что Console класса или делает, но в ваших методах событий мыши, вам нужно будет обновлять его так, что он может обновить это выход ...

Обновлен например

enter image description here

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

      } 
     } 
    } 
} 

Я бы предположил, что у вас есть время, чтобы прочитать ...

  • Creating a GUI with Swing, чтобы получить понимание общих основ свинг
  • Performing Custom Painting, чтобы получить представление о том, как на заказ картина на самом деле выполняется в свинг
  • Painting in AWT and Swing, как все разработчики, желающие выполнить собственную картину в свинг необходимости понять, как это работает ...

Обновление с чистой AWT версии

Как указал мне, что OP использует AWT вместо Swing, почему, потому что они, кажется, чтобы быть в состоянии ...

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

      } 
     } 
    } 
} 
+0

Я пропустил что-то повторное. ваше редактирование на вопрос? Импорт для кода - чистый AWT, и он расширяет 'Panel', а не' JPanel'. Я думаю, [tag: swing] должен быть [tag: awt]. Но тогда вопрос для ОП - «Зачем использовать AWT?». –

+0

Пропустил OP с использованием AWT, но (другой, затем paintComponent), остальная часть примерно такого же подхода – MadProgrammer

Смежные вопросы