我如何构建自己的KeyEvent
对象,它完全(或非常接近)匹配我从KeyListener
最终用户输入内容时收到的对象?
例如,我有一个英国的ISO键盘布局,并键入"
我按下的字符Shift+2
.如果我JFrame
用a 记录这个KeyListener
,我会收到以下事件:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=50,keyText=2,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=50,keyText=2,keyChar='"',keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
Run Code Online (Sandbox Code Playgroud)
我想创建一个方法,我将其"
作为char参数,它将返回上面列出的KeyEvents数组.
我的问题是:
在KEY_PRESSED
和KEY_RELEASED
事件中,keyChar='"'
表示按下的字符("
),但是keyCode=50
指的是"非移位"的ASCII值(又名2
).我需要知道如何从"
字符中获取这个非移位值.
对于不同的键盘布局,此非移位值也将不同.例如,美国ANSI布局需要Shift+'
键入"
密钥,这意味着keyCode
将是39而不是50.
在某些键盘布局中,Shift键需要键入键,而不是其他键.#
例如,该字符需要Shift+3
美国ANSI键盘,但不需要在英国ISO键盘上按压.我需要知道是否应该模拟移位按下/释放事件并提供移位修改器.
任何有关如何解决这些问题的见解将不胜感激.我还应该注意,Robot
在我的情况下使用该类不能使用.
我已经阅读了几次关于键绑定的明确教程,但是我的脑缓存似乎不足以容纳复杂的进程.
我正在调试一个键绑定问题(事实证明我使用的是错误的JComponent.WHEN_*
条件),我偶然发现javax.swing.KeyboardManager
了一个(不幸的)匿名Java工程师私有包的简洁和欢闹的javadoc .
我的问题是:除了KeyEventDispatcher
在一开始就检查过,描述是否错过和/或错误?
KeyboardManager类用于帮助调度WHEN_IN_FOCUSED_WINDOW样式操作的键盘操作.具有其他条件的操作直接在JComponent中处理.
下面是我理解的键盘调度应该如何工作的语法[原文如此]的描述.[原文如此].
KeyEvents被分派到焦点组件.焦点管理员首先处理此事件.如果焦点管理器不想要它,那么JComponent调用super.processKeyEvent(),这允许侦听器有机会处理事件.
如果没有一个听众"消费"该事件,那么键绑定就会得到一个镜头.事情开始变得有趣.首先,使用WHEN_FOCUSED条件定义的KeyStokes [sic]有机会.如果这些都不想要该事件,那么该组件会通过它[sic]父母查找WHEN_ANCESTOR_OF_FOCUSED_COMPONENT类型的操作.
如果还没有人接受它,那么它就会在这里结束.然后,我们查找为WHEN_IN_FOCUSED_WINDOW事件注册的组件并触发它们.请注意,如果没有找到这些,那么我们将事件传递给菜单栏并让它们有一个裂缝.他们的处理方式不同.
最后,我们检查一下是否正在查看内部框架.如果我们是,并且没有人想要这个事件,那么我们将向上移动到InternalFrame的创建者,看看是否有人想要这个事件(依此类推等等).
(更新)如果你曾经想过关键绑定指南中这个大胆的警告:
因为搜索组件的顺序是不可预测的,所以避免重复WHEN_IN_FOCUSED_WINDOW绑定!
这是因为以下部分KeyboardManager#fireKeyboardAction
:
Object tmp = keyMap.get(ks);
if (tmp == null) {
// don't do anything
} else if ( tmp instanceof JComponent) {
...
} else if ( tmp instanceof Vector) { //more than one comp registered for this
Vector v = (Vector)tmp;
// There is no well defined order for WHEN_IN_FOCUSED_WINDOW
// bindings, but we …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个专为浏览器和移动设备设计的网页,但我遇到了黑莓手机的问题
我想要的功能是在按下键时触发弹出窗口.我目前的代码可以在浏览器中使用,但不能在黑莓上运行.我在运行OS 5.0的黑莓模拟器上启用了javascript和javascript弹出窗口.
最初的电话:
window.onkeyup = GetKeyUp;
Run Code Online (Sandbox Code Playgroud)
然后方法:
function GetKeyUp(e) {
var KeyID = (window.event) ? event.keyCode : e.keyCode;
alert(KeyID);
}
Run Code Online (Sandbox Code Playgroud)
什么不适用于可在浏览器中运行的Blackberry?或者:
如何从javascript捕获黑莓上的按键?
谢谢,Ty
最新开发:使用"window.addEventListener("keyup",...)"或"document.addEventListener("keyup",...)"而不是工作.
我正在一个充满要填充的表格的网站上工作,我需要按下退出按钮时焦点移动到下一个输入控件,就像按"标签"一样.我发现当keypressed为13时移动焦点的代码,但这需要将元素的ID集中在上面
<input id="Text1" type="text" onkeydown="return noNumbers(event)" />
<input id="Text2" type="text" />
<script type="text/javascript">
function noNumbers(e) {
keynum = e.which;
if (keynum == 13)
document.getElementById("Text2").focus();
}
</script>
Run Code Online (Sandbox Code Playgroud)
我需要一个通用的功能,当按键代码是13"即输入"触发按下9的默认事件"是标签",当然在Javascript
我的应用程序中有一个登录页面,其中列出了以下元素:
按下时Login
,它将进入主屏幕.当用户Done
在软键盘上键入密码完成时点击时,执行相同的动作Samsung Galaxy S3
; 和Enter
软键盘上的键HTC One X
.
那么,密码字段的EditText如何是:
<EditText
android:id="@+id/password_txt"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="8dp"
android:singleLine="true" />
Run Code Online (Sandbox Code Playgroud)
在活动中,无论我尝试了什么,都在这里:
EditText mPassword = (EditText) findViewById(R.id.password_txt);
mPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER || actionId == EditorInfo.IME_ACTION_DONE){
Log.e("MyApp", " ------> IN EDITOR ACTION DONE");
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
我确实尝试保持密码字段的imeOptions actionDone
以及flagNoExtractUi …
android login keyevent android-softkeyboard android-edittext
有没有办法input[type="text"]
在BlackBerry中捕获退格键?我试过$('input[type="text"]').bind('keydown', function(event) { ... });
并捕获除退格(del)之外的所有按键事件.按此键不会触发任何键事件.
有谁知道捕捉事件的方法?
我正在为OS 6.0开发并使用BlackBerry模拟器9800进行测试.
编辑 - 我正在测试的代码
<div id="myPage" data-role="page" data-theme="b">
<div data-role="content">
<input type="text" id="ddd" />
</div>
<script type="text/javascript">
$('input[type="text"]').bind('keydown', function(e){
if(e.keyCode == 8)
alert('backspace trapped')
});
</script>
</div>
Run Code Online (Sandbox Code Playgroud) blackberry keyevent blackberry-simulator jquery-mobile jquery-events
我希望我的JavaFX程序能够响应键盘事件.
我尝试将监听器添加到root Pane
,最顶层Pane
,但它不响应事件!
这是我的代码:
AnchorPane root = new AnchorPane();
root.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
pressKey(t.getCharacter().charAt(0));
}
});
root.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
releaseKey(t.getCharacter().charAt(0));
}
});
root.addEventHandler(EventType.ROOT, new EventHandler<Event>() {
@Override
public void handle(Event t) {
if (t.getClass().equals(KeyEvent.class)) {
System.out.println("AAARGH! " + ((KeyEvent)t).getCharacter());
}
}
});
Run Code Online (Sandbox Code Playgroud)
为什么你不工作,关键事件?我在这里做错了吗?
可以肯定的是,鼠标事件可以使用相同的代码正常工作.
OSX上的Java 6/7中存在一个错误,在拖放操作期间,它会忽略META(CMD)密钥.(Ctrl键在Windows上运行正常,在OSX上也忽略Ctrl键)我真的需要这个工作.
我尝试将KeyEventDispatcher侦听器添加到KeyboardFocusManager,但在Drag操作期间不会调用它.
也不会调用父JPanel的processKeyEvent()方法.
那么,有什么地方可以放钩来检测META按键吗?
我想让我的浏览器全屏.和我们做F11关键事件时一样.我发现了一些例子
function maxwin() {
var wscript = new ActiveXObject("WScript.Shell");
if (wscript!=null) {
wscript.SendKeys("{F11}");
}
}
Run Code Online (Sandbox Code Playgroud)
哪个不适用于Mozilla或任何其他最新的浏览器.如果有任何方法可以解决这个问题,请告诉我.
谢谢.(提前.)
目前,我在移动设备上遇到问题.我有一个输入字段,只允许按下某些键:例如,只有数字0-9.它在网络浏览器上运行得很棒.但是当我在我的Android移动设备中打开它时,它会失败.
我用过keyup
和keypress
.keyup
正在工作,但我想知道哪个键从移动键盘发起了事件.我怎么会这样?
keyevent ×10
javascript ×4
java ×3
android ×2
blackberry ×2
swing ×2
browser ×1
fullscreen ×1
javafx-2 ×1
jquery ×1
key-bindings ×1
login ×1
macos ×1
mobile ×1
onkeydown ×1
screen ×1