2014-02-14 3 views
0

Я хочу, чтобы моя программа начала печатать значения RGB под моей мышью, когда я включаю флажок, называемый doos, и я хочу, чтобы он остановил момент, когда он отменен.Как мне переопределить JCheckBox

private void doosActionPerformed(java.awt.event.ActionEvent evt) { 

    if (doos.isEnabled()) { 
     try { 
      zwevendeMuis =true; 
      robot = new Robot(); 

      while (zwevendeMuis==true) { 

       pointer = MouseInfo.getPointerInfo(); 
       point = pointer.getLocation(); 
       color = robot.getPixelColor((int) point.getX(), (int) point.getY()); 
       System.out.println("Color at: " + point.getX() + "," + point.getY() + " is: " + color); 
      } 
     } catch (Exception e) { 
     }    
    } 
    else{ 
     zwevendeMuis =false; 

    } 
} 

Спасибо за ваше время

EDIT: Я не знаю, если я должен отправить другую нить по этому вопросу, но я был в состоянии принять это один шаг дальше я думаю. Я пробовал некоторые вещи через многопоточность, ниже вы можете увидеть обновленный код. Класс проверки - это параметр runnable, который я передаю с объектом «mythread», чтобы изменить код между EDT и рабочим потоком. Теперь это своего рода делает то, что я хочу, за исключением моего кода нерестом многочисленных ошибок при выходе и входе в элемент:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException 
    at java.lang.Thread.start(Thread.java:682) 
    at testgui.TestGUI$1.mouseEntered(TestGUI.java:126) 
    at java.awt.Component.processMouseEvent(Component.java:6514) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
Color at: 495.0,520.0 is: java.awt.Color[r=168,g=51,b=162] 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4620) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4474) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
Color at: 498.0,516.0 is: java.awt.Color[r=168,g=51,b=162] 

    at java.awt.EventQueue$3.run(EventQueue.java:688) 
    at java.awt.EventQueue$3.run(EventQueue.java:686) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:702) 
    at java.awt.EventQueue$4.run(EventQueue.java:700) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
Color at: 499.0,515.0 is: java.awt.Color[r=168,g=51,b=162] 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Мой обновленный код:

class Check implements Runnable { 

      @Override 
      public void run() { 
       go(); 
      } 

      public void go() { 
       System.out.println(""); 

      } 

     } 

     @Override 
     public void mousePressed(MouseEvent me) { 
     } 

     @Override 
     public void mouseReleased(MouseEvent me) { 
     } 

     @Override 
     public void mouseEntered(MouseEvent me) { 
      zwevendeMuis = true; 
      Runnable control = new Check(); 
      Thread mythread = new Thread(control); 
      try { 
       robot = new Robot(); 

      } catch (AWTException ex) { 
       Logger.getLogger(TestGUI.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      while (zwevendeMuis == true) { 
       pointer = MouseInfo.getPointerInfo(); 
       point = pointer.getLocation(); 
       color = robot.getPixelColor((int) point.getX(), (int) point.getY()); 
       System.out.println("Color at: " + point.getX() + "," + point.getY() + " is: " + color); 
       mythread.start(); 
      } 
     } 

     @Override 
     public void mouseExited(MouseEvent me) { 
      zwevendeMuis=false; 
     } 
+0

Вы захватываете значения пикселей в произвольных точках экрана? IE не входит в компонент Swing/AWT. (Судя по вашему использованию Robot, это похоже на то, что вы делаете.) – Radiodef

ответ

2

Вы блокируете событие Dispatching Thread своим бесконечным циклом.

EDT несет ответственность за многие вещи, включая обработку событий и рисование. Любое действие, которое блокирует/останавливает этот поток, не позволит вашему приложению получать новые события или обрабатывать новые запросы на рисование.

Swing - это однопоточная среда и не является потокобезопасной, поэтому, в то время как вы можете создать новый Thread, вам необходимо убедиться, что любой код, взаимодействующий с пользовательским интерфейсом, был выполнен таким образом в контексте EDT ,

Более простым решением было бы использовать SwingWorker, что позволит вам контролировать положение мыши из в фоновом потоке, но имеет publish и process методы, что упрощает процесс синхронизации EDT.

Посмотрите на Concurrency in Swing для получения более подробной информации.

+0

Я снова обновил свой OP с помощью нового кода. Однако я не использовал SwingWorker. Будет ли мой новый код достаточным после решения ошибок или неразрешимого беспорядка? – BURNS

+0

И смотря на swingworker здесь: http: //docs.oracle.com/javase/tutorial/uiswing/examples/components/TumbleItemProject/src/components/TumbleItem.java Имеет ли код от SwingWorker worker = новый SwingWorker () должен быть в определенном методе или в основном или? – BURNS

+1

Наличие «MouseListener», завернутого в «Runnable», не поможет, события мыши будут по-прежнему подниматься из контекста EDT, возвращая вас на квадратный. Вам нужно объединить 'MouseInfo' из метода' run' или 'doInBackground'' SwingWorker' – MadProgrammer

0

Ваш while цикл будет мешать ваша программа ничего не делает. Вы должны переключать логическое значение при нажатии на свой флажок (zwevendeMuis = doos.isEnabled()), и вы должны зарегистрировать MouseMotionListener с одним или несколькими компонентами приложения, которое будет печатать значение цвета, если zwevendeMuis истинно.

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