2013-08-28 40 views
1

我做了一個簡單的自動點擊器,但是當我運行它時,屏幕變黑,所以我不能停止它等我沒有線索我做錯了什麼。我想也許我必須設定重點,但我不確定。 代碼:自動點擊器UI開始時黑色

import java.awt.AWTException; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Robot; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import javax.swing.UIManager; 
import javax.swing.JRadioButton; 

public class AutoClicker1 extends JFrame { 

    private JPanel contentPane; 
    private JTextField textField; 

    public static int rate; 
    public static boolean go = false; 
    public static int time; 
    public static int multiplyer; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        AutoClicker1 frame = new AutoClicker1(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public AutoClicker1() { 
     setTitle("Auto Clicker"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 361, 154); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel lblNoOfClicks = new JLabel("Interval between clicks"); 
     lblNoOfClicks.setBounds(10, 25, 149, 14); 
     contentPane.add(lblNoOfClicks); 

     textField = new JTextField(); 
     textField.setBounds(10, 55, 139, 20); 
     contentPane.add(textField); 
     textField.setColumns(10); 

     JButton btnStopf = new JButton("Stop(F11)"); 
     btnStopf.setBounds(203, 45, 89, 23); 
     contentPane.add(btnStopf); 

     JButton button = new JButton("Stop(F11)"); 
     button.setBounds(203, 81, 89, 23); 
     contentPane.add(button); 

     final JRadioButton rdbtnSeconds = new JRadioButton("Seconds"); 
     rdbtnSeconds.setBounds(6, 81, 65, 23); 
     contentPane.add(rdbtnSeconds); 

     final JRadioButton rdbtnMilliseconds = new JRadioButton("Milliseconds"); 
     rdbtnMilliseconds.setBounds(71, 81, 109, 23); 
     contentPane.add(rdbtnMilliseconds); 
     btnStopf.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       go = false; 
      } 

     }); 
     JButton btnStart = new JButton("Start(F10)"); 
     btnStart.setBounds(203, 11, 89, 23); 
     contentPane.add(btnStart); 
     btnStart.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       go = true; 
       if (rdbtnMilliseconds.isSelected()) { 
        autoClick(); 
       } else { 
        if (rdbtnSeconds.isSelected()) { 
         multiplyer = 1000; 
         autoClick(); 
        } 
       } 
      } 
     }); 

    } 

    private void autoClick() { 
     requestFocus(); 
     rate = Integer.parseInt(textField.getText()); 
     time = (rate * multiplyer); 
     System.out.print(time); 
     try { 
      Robot robot = new Robot(); 
      while (true) { 
       try { 
        Thread.sleep(rate); 
        robot.mousePress(InputEvent.BUTTON1_MASK); 
        robot.mouseRelease(InputEvent.BUTTON1_MASK); 
       } catch (InterruptedException ex) {} 
      } 
      } catch (AWTException e) {} 
    } 

    private void keyListner(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_F10) { 
      System.out.print("pressed F10"); 
      go = true; 
     } 
     if (key == KeyEvent.VK_F11) { 
      go = false; 
     } 
    } 

    private void setTheme() { 
     try { 
      UIManager 
        .setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel"); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 

    public static void checkRate() { 
     if (rate < 500) { 
      rate = 0; 
     } 
    } 
} 
+0

'while(true)'你在期待什麼? – nachokk

回答

5

您阻斷autoClick()the Event Dispatch Threadwhile(true),而不是您可以使用一個Swing Timer。 我建議不要使用keyListener只聽2個鍵,你可以使用keybindings來達到這個目的。你也不應該直接打電話setBounds依靠合適的LayoutManager在屏幕上定位。

+0

這是怎麼回事? 'http:// pastebin.com/tJ4vnB3G'尚未添加密鑰綁定 – WillBaker

+0

@WillBaker你仍然有一些大錯誤,請不要使用'NULL'佈局,只會導致你的電腦工作..讓它工作到佈局管理器,我說你使用'SwingTimer'你使用的java.util.Timer也是有效的,但在Swing東西中首選使用SwingTimer,並且檢查你是否將if(go = true)'放在'if (go == true)' – nachokk

+0

好的,謝謝,我會修正NULL佈局,這是因爲我用窗口生成器:D – WillBaker

0

當你在你的AutoClick方法中輸入wile循環時,你可以跳出Main方法中的程序循環。

你可以改爲在「遊戲循環」中運行你的程序。

在main方法是什麼我會做的是創建一個方法調用,run()的

public void run() 
{ 
    int FPS = 60; 

    float startTime = System.currentTimeInMillis(); 

    while(started) 
    { 
     float currentTime = System.currentTimeInMillis(); 
     float passedTime = currentTime - startTime; 

     startTime = System.currentTimeInMillis(); 

     if(passedTime > (float) 1000/FPS) 
      { 
      update(); 
      } 
    } 
} 

,然後在更新方法把程序的邏輯。我知道這是一種完全不同的方法來處理你目前的工作方式,但在我看來,它可以提供更多的靈活性。

例如,在您的動作偵聽器中,您可以調用「startClick()」方法 ,將方法設置布爾值爲true並初始化您在autoclick方法中當前初始化的內容。那麼你的update()方法是這樣的:

public void update() 
{ 
    if(boolean) //boolean value that startClick sets to true 
    { 
     robot.mousePress(InputEvent.BUTTON1_MASK); 
     robot.mouseRelease(InputEvent.BUTTON1_MASK); 
    } 
} 

這樣的程序沒有停留在一個無限while循環,你可以控制往往updateswith的FPS變量。

+1

謝謝,但我在看到你的帖子之前修復了它:) – WillBaker