2016-08-15 2 views
-1

시작 버튼을 클릭하면 뒤로를 클릭하거나 중지 할 수 없습니다. 앱을 중지해야합니다. 앱을 중지하는 한 가지 방법은 컴퓨터의 전원을 꺼야한다는 것입니다. D. 앱이 실행 중일 때 시작 버튼이 잠겨서 클릭 할 수 없습니다. 종료 버튼을 클릭하면 작동하지 않습니다. 이 응용 프로그램은 간단한 AutoClicker입니다. 로봇 클래스보다 autoclicker를 더 잘하는 Java가 있습니까? 어떻게 해결할 수 있습니까? 어디에도 오류가 있습니까? 아니면 앱을 중지하기 위해 할 수있는 일이 있습니까? 발생하는 어떤 그림 그리기, 이벤트, 등 ...을 (동부 서머 타임)를 스레드를 잠그고 방지 할 스레드에 어떤 긴 실행중인 작업을 호출 -오토 클 릭커를 실행할 때 멈출 수 없습니다

import java.awt.AWTException; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Robot; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 
import java.awt.Color; 


public class AutoClicker extends JFrame { 

private JPanel contentPane; 
private final JLabel m = new JLabel("AutoClicker"); 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       AutoClicker frame = new AutoClicker(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public AutoClicker() { 

    setAlwaysOnTop(false); 
    setTitle("AutoClicker"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 147, 162); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JCheckBox chckbxOnTop = new JCheckBox("On Top"); 
    boolean onTop = false; 
    chckbxOnTop.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 

      if(chckbxOnTop.isSelected()){ 
       setAlwaysOnTop(true); 
      } 
      else{ 
       setAlwaysOnTop(false); 
      } 

     } 
    }); 
    chckbxOnTop.setBounds(6, 7, 97, 23); 
    contentPane.add(chckbxOnTop); 




    JCheckBox chckbxAutoclicker = new JCheckBox("AutoClicker"); 
    chckbxAutoclicker.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      while(chckbxAutoclicker.isSelected()){ 

         try { 
          Robot r = new Robot(); 
          r.mousePress(MouseEvent.BUTTON1_MASK); 
          r.setAutoDelay(1080); 
          r.mouseRelease(MouseEvent.BUTTON1_MASK); 
         } catch (AWTException e1) { 

          e1.printStackTrace(); 
         } 

        } 
       } 



    }); 
    chckbxAutoclicker.setBounds(6, 80, 97, 23); 
    contentPane.add(chckbxAutoclicker); 
    m.setForeground(new Color(153, 102, 0)); 
    m.setBounds(16, 92, 120, 31); 
    contentPane.add(m); 
} 
} 
+0

왜 두 개의 중첩 무한 루프를 사용하고 있습니까? 그리고 왜 도대체'while (something)'대신'for (;;)'를 사용하고 있습니까? 그리고 당신의 프로그램이 모든 것을 끊는 것 외에는 무엇을 기대합니까? – luk2302

+0

루프에 대해 두 개를 제거하고 루프 중에 하나를 추가하면 닫히거나 중지 할 수 없습니다. –

+0

당신은 심지어 그것을 막으려 고하지 않았습니다 – luk2302

답변

2

스윙은 단일 스레드입니다. ActionListener 구현 중 하나는 무한 루프 작성은 동부 서머 타임에 평가되기 때문에

while(chckbxAutoclicker.isSelected()){ 

위, false로 평가하지 않을 것입니다 및 이벤트 (예 : JCheckBox을 해제로이 메소드가 false를 반환 할 수 있도록)를 할 수 없습니다 EDT가 무료가 될 때까지 발생합니다. EDT가 필요한 작업을 수행하는 동안 계속해서 작업을 실행하려면 세 가지 옵션이 있습니다.

  1. 새로 만들기 Thread을 만듭니다. 당신은 EDT에 나중에 뭔가를, 또는 EDT에 일정에 뭔가를 실행하고자하는 경우 SwingWorker
  2. 를 사용 SwingUtilities.invoke*
  3. 사용하여 EDT에 파견해야이 스레드에서 스윙하는 모든 호출을 참고 사용 a javax.swing.Timer
관련 문제