我下面发布的示例代码显示了两个类。一个实现KeyListener,另一个实现Runnable,并在每20
ms休眠的无限循环中运行。当按下键时,采用int形式的keyChar用作索引,设置布尔数组的索引true或false,表示是否按下了该键。同时,过程循环正在键数组中搜索其true或false值,并将true设置为false,然后打印出char。我的问题是我是否需要使用带锁的同步来访问charArray,因为它在两个线程中使用:进程线程和键侦听器线程。
样例代码:
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Input implements KeyListener {
public boolean[] charArray;
public Input(Component component) {
charArray = new boolean[127];
component.addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
(possible synchronization with a lock?)
int keyChar = e.getKeyChar();
if (keyChar == 27 || keyChar == 9 || keyChar == 10 || keyChar == 127) //useless keys like del, tab, esc, etc..
keyChar = 65535;
if (keyChar < 65535) //65535 represents no true char value
charArray[keyChar] = true;
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
import java.awt.Dimension;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Process extends JFrame implements Runnable {
private boolean running;
private Input input;
public Process() {
running = false;
input = new Input(this);
setTitle("Keyboard Test");
setSize(new Dimension(200, 200));
toFront();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
new Process().startThread();
}
public synchronized void startThread() {
running = true;
new Thread(this).start();
}
@Override
public void run() {
while (running) {
(possible synchronization with a lock?)
for (int i = 0; i < input.charArray.length; i++) {
if (input.charArray[i] == true) {
input.charArray[i] = false;
System.out.println((char) i);
}
}
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
}
}
}
您的charArray
变量至少可以从两个线程(在Process中启动的一个线程和您的Input类中的EDT)访问,因此您需要同步这些访问以确保可见性(即,确保一个线程所做的更改在另一个线程中可见)
)。
请注意,您的代码中还有其他一些问题,例如:
input = new Input(this)
或component.addKeyListener(this)
)-这可能导致在多线程环境中出现怪异的行为JFrame
在Process
类中使用变量而不是扩展JFrame
running
为false,但是run
方法中该变量周围没有同步,因此您可能看不到它变为false。我的目标是向用户显示一个对话框,以便用户能够选择要添加到舞台上的演员。我在实现Screen和GestureListener的应用程序的主屏幕中执行此操作。(我需要手势监听器来听双击)。我在重写的touchtown()方法中创建对话框。当对话框出现时,它不工作。如果我点击屏幕上的任何一点,屏幕会一直监听着地的输入。 代码如下:
问题内容: 本质上,我希望更改内容时执行脚本。由于脚本是分开的(Chrome扩展程序和网页脚本中的内容脚本),因此我需要一种方法来简单地观察DOM状态的变化。我可以设置轮询,但这似乎草率。 问题答案: 长期以来,DOM3突变事件是最佳的可用解决方案,但由于性能原因,不建议使用它们。DOM4突变观察者代替了不推荐使用的DOM3突变事件。目前,它们在现代浏览器中的实现方式为(或在旧版Chrome中由供
我使用的是Reactive Spring Cloud Stream,在创建没有输出的StreamListener时遇到了困难。只要没有收到格式错误的消息,下面的代码就可以工作。当收到格式错误的消息时,流量将关闭。 如果我理解正确的话,最好让框架订阅流量,而不是手动订阅流量。当侦听器有输出时,这不是一个问题,因为我可以简单地返回流量,如下所示: 框架似乎以一种在返回时不会关闭流量的方式处理坏消息。当
在贝宝的沙箱中进行了充分的测试,并使该过程完美地工作。我已经直播了,但它不起作用。 我通过notify_url从PayPal收到了POST数据。然后,在数据前面使用cmd=_notify-validate将其发送回PayPal。 使用PayPals文档代码,我用这个来发送消息到PayPal。
问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。
我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real