【发布时间】:2015-11-21 15:25:43
【问题描述】:
免责声明:我没有将我的程序用于任何恶意,即使它的名称是 Spambot。我只是用来练习的。
编辑:我的问题是,如果我按下一个按钮,GUI 就会冻结,因此我无法按下另一个按钮,直到第一个按钮完成其工作。我该如何解决这个问题?
我创建了一个类(SpambotGUI),它基本上是一个包含 3 个 JButton 的 JFrame。这是它的代码:
public class SpambotGUI extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
static JButton button1 = new JButton("Spam first file");
static JButton button2 = new JButton("Spam second file");
static JButton button3 = new JButton("Stop");
public SpambotGUI() throws AWTException {
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button1.setActionCommand("spam1");
button2.setActionCommand("spam2");
button3.setActionCommand("stop");
button1.setMnemonic(KeyEvent.VK_F7);
button2.setMnemonic(KeyEvent.VK_F8);
button3.setMnemonic(KeyEvent.VK_F9);
button3.setToolTipText("Stop the program");
add(button1, BorderLayout.WEST);
add(button2, BorderLayout.CENTER);
add(button3, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
System.out.println(java.awt.EventQueue.isDispatchThread());
if ((e.getActionCommand()).equals("spam1")) {
try {
Spambot.Start("data/spambotLines1.txt");
} catch (FileNotFoundException | AWTException | InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if ((e.getActionCommand()).equals("spam2")) {
try {
Spambot.Start("data/spambotLines2.txt");
} catch (FileNotFoundException | AWTException | InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if ((e.getActionCommand()).equals("stop")) {
Spambot.stopped = true;
Spambot.thread.interrupt();
}
}
public static void CreateGUI() throws AWTException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpambotGUI buttons = new SpambotGUI();
buttons.setOpaque(true);
frame.setContentPane(buttons);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) throws Exception {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CreateGUI();
} catch (AWTException e) {
e.printStackTrace();
}
}
});
}
}
我还有一个Spambot 类,它包含以下内容:在Start 方法中,我有一个循环,包含不相关的东西和thread.Sleep-s(我创建了一个名为thread 的新Thread(),这就是为什么它在SpambotGUI) 中用小写字母t 拼写,并且循环应该一直运行到Spambot 中的stopped boolean 为假。如果我在 GUI 中按下 Stop 按钮,后者将被设置为 false。问题是当Start 中的循环正在运行时,我无法单击GUI 中的任何按钮。我在互联网上阅读了这个之后,我得出的结论是我应该在这里使用多线程。
问题是,我只是不知道它应该如何工作。我尝试在我的Spambot 类中实现Runnable,然后从SpambotGUI 调用run() 方法,但没有任何改变。
有人知道我应该在这里做什么吗?
编辑:这是Spambot 类的一部分:
public class Spambot{
private static Robot robot;
public static Thread thread = new Thread();
public static boolean stopped = false;
public static void main(String... args) throws Exception {
}
public static void Start(String path) throws AWTException, InterruptedException, FileNotFoundException {
Scanner input = new Scanner(new FileReader(path));
Spambot keyboard = new Spambot();
Random rand = new Random();
robot.keyPress(KeyEvent.VK_ALT);
thread.sleep(150);
robot.keyPress(KeyEvent.VK_TAB);
thread.sleep(150);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_ALT);
thread.sleep(500);
while (input.hasNextLine() && !stopped) {
keyboard.type(input.nextLine());
thread.sleep(rand.nextInt(1500)+1000);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
input.close();
}
public Spambot() throws AWTException {
Spambot.robot = new Robot();
}
public Spambot(Robot robot) {
Spambot.robot = robot;
}
}
【问题讨论】:
-
听起来您的 Start1/2 代码实际上并未在其他线程中运行。
-
请贴出线程代码
-
我和其他班级一起编辑了我的帖子。
-
don't just copy in your entire program!。也很清楚你要什么?
-
我认为是(另外,我删除了程序中不相关的部分)。我的问题是,如果我按下一个按钮,GUI 就会冻结,因此在第一个按钮完成工作之前我无法按下另一个按钮。
标签: java multithreading swing