[英]How do I need to reimplement the JCheckBox
我希望我的程序開始在我的鼠標下打印RGB值,我啟用一個名為doos的復選框的那一刻,我希望它在取消選擇時停止。
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;
}
}
感謝您的時間
編輯:我不知道我是否應該在這個問題上發布另一個帖子,但我能夠更進一步,我認為。 我通過多線程嘗試了一些東西,下面你可以看到更新的代碼。 Check類是我使用'mythread'對象給出的runnable參數,使我的代碼在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;
}
您正在使用無限循環阻止事件調度線程。
EDT負責許多事情,包括事件處理和繪畫。 阻止/停止此線程的任何操作都將阻止您的應用程序接收新事件或處理新的繪制請求。
Swing是一個單線程環境並且不是線程安全的,所以當你可以產生一個新的Thread
,你需要確保任何與UI交互的代碼都是在EDT的上下文中完成的。
一個更簡單的解決方案是使用SwingWorker
,它允許您從后台線程中監視鼠標位置,但具有簡化EDT同步過程的publish
和process
方法。
有關更多詳細信息,請參閱Swing中的Concurrency 。
你的while
循環將阻止你的程序做任何其他事情。 單擊復選框時應切換一個布爾值( zwevendeMuis = doos.isEnabled()
),並且應該為應用程序的一個或多個組件注冊MouseMotionListener
,如果zwevendeMuis
為true,將打印顏色值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.