求助JAVA多个监听器同时使用 监听器 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class TT extends JFrame { private int title = 0; private int times; final JFrame jf; Button jb; JPanel panel; Label tx_lab; final TextField tx; static int command = 0; public TT() { jf = new JFrame(String.valueOf(title)); panel = new JPanel(); tx_lab = new Label("次数"); tx = new TextField(); jb = new Button("点我"); Label resolution_lab = new Label("坐标"); final TextField resolutionX = new TextField(); final TextField resolutionY = new TextField(); resolutionX.setText("1000"); resolutionY.setText("1000"); tx.setSize(50, 50); tx.setText("5"); jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { public void run() { Robot robot; try { robot = new Robot(); times = Integer.valueOf(tx.getText()); for (int i = 0; i < times; i++) { robot.mouseMove(Integer.valueOf(resolutionY .getText()), Integer .valueOf(resolutionY.getText())); // robot.mousePress(InputEvent.BUTTON1_MASK); robot.delay(500); // robot.mouseRelease(InputEvent.BUTTON1_MASK); robot.delay(500); title++; jf.setTitle(String.valueOf(title)); listener(); } } catch (AWTException e1) { e1.printStackTrace(); } } }).start(); } }); jf.add(panel); panel.add(resolution_lab); panel.add(resolutionX); panel.add(resolutionY); panel.add(tx_lab); panel.add(tx); panel.add(jb); jf.pack(); jf.setSize(300, 300); jf.setVisible(true); } public void listener() { jb.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 27) { System.exit(-1); } command = e.getKeyCode(); System.out.println(command); } }); } public static void main(String[] args) throws Exception { TT tt = new TT(); }} terry21 谢谢你。明白了,原来是要多起一个线程 不过追问一下哦,我之前也有用过线程试过 @Override public void run() { listener(); }public static void main(String[] args) throws Exception { T t = new T(); Thread t1 = new Thread(t); t1.start(); }大概代码是这样的。。但是没有达到你的效果能告知一下原理吗~谢谢。 单线程规则:Swing线程在同一时刻仅能被一个线程所访问。一般来说,这个线程是事件派发线程(event-dispatching thread)。规则的例外:有些操作保证是线程安全的。事件分发:如果你需要从事件处理(event-handling)或绘制代码以外的地方访问UI,那么你可以使用SwingUtilities类的invokeLater()或invokeAndWait()方法。创建线程:如果你需要创建一个线程??比如用来处理一些耗费大量计算能力或受I/O能力限制的工作??你可以使用一个线程工具类如SwingWorker或Timer。========================================================================你这样写线程根本就没有意义的,你创建一个线程来跑TT,然后主线程马上就结束了,跟没有创建线程,直接主线程来跑TT是一样效果的。建议每一个耗时的swing事件操作都启动一条线程来跑,最好使用ExecutorService来管理所有线程,它会重复利用线程资源。 win7卸载jdk时windows installer安装包有问题 UDP 广播,,杂用啊... file问题 小问题,望帮忙解决 麻煩请问 Jtable怎样可以设置表头在左边显示 为什么子类构造器总是会调用父类构造器? 怎么让applet小程序里的jpg图片放大缩小 java比C++好在那里?人的精力是有限的 新手问题:如何自定义异常,并且调用? 如何在jbuilder 一个Frame中增加图片? java 的一个关于数组的问题 Callable和Runnable是不是也是(简单的)线程?
public class TT extends JFrame { private int title = 0; private int times; final JFrame jf; Button jb; JPanel panel; Label tx_lab; final TextField tx; static int command = 0; public TT() {
jf = new JFrame(String.valueOf(title));
panel = new JPanel();
tx_lab = new Label("次数");
tx = new TextField();
jb = new Button("点我");
Label resolution_lab = new Label("坐标");
final TextField resolutionX = new TextField();
final TextField resolutionY = new TextField();
resolutionX.setText("1000");
resolutionY.setText("1000");
tx.setSize(50, 50);
tx.setText("5"); jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() { public void run() {
Robot robot;
try {
robot = new Robot();
times = Integer.valueOf(tx.getText());
for (int i = 0; i < times; i++) {
robot.mouseMove(Integer.valueOf(resolutionY
.getText()), Integer
.valueOf(resolutionY.getText()));
// robot.mousePress(InputEvent.BUTTON1_MASK);
robot.delay(500);
// robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(500);
title++;
jf.setTitle(String.valueOf(title));
listener();
}
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}).start();
}
});
jf.add(panel);
panel.add(resolution_lab);
panel.add(resolutionX);
panel.add(resolutionY);
panel.add(tx_lab);
panel.add(tx);
panel.add(jb);
jf.pack();
jf.setSize(300, 300);
jf.setVisible(true);
} public void listener() {
jb.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 27) {
System.exit(-1);
}
command = e.getKeyCode();
System.out.println(command);
}
});
} public static void main(String[] args) throws Exception {
TT tt = new TT();
}}
@Override
public void run() {
listener();
}
public static void main(String[] args) throws Exception {
T t = new T();
Thread t1 = new Thread(t);
t1.start();
}
大概代码是这样的。。但是没有达到你的效果能告知一下原理吗~谢谢。
规则的例外:有些操作保证是线程安全的。
事件分发:如果你需要从事件处理(event-handling)或绘制代码以外的地方访问UI,那么你可以使用SwingUtilities类的invokeLater()或invokeAndWait()方法。
创建线程:如果你需要创建一个线程??比如用来处理一些耗费大量计算能力或受I/O能力限制的工作??你可以使用一个线程工具类如SwingWorker或Timer。
========================================================================
你这样写线程根本就没有意义的,你创建一个线程来跑TT,然后主线程马上就结束了,跟没有创建线程,直接主线程来跑TT是一样效果的。建议每一个耗时的swing事件操作都启动一条线程来跑,最好使用ExecutorService来管理所有线程,它会重复利用线程资源。