- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 JFrame
中有一个 JFileChooser
。我在 JFileChooser
中添加了一个 ActionListener
,以便在单击时“取消”按钮起作用。我也可以切换到“取消”按钮,但是当我按下“Enter”键时,没有任何反应(即 ActionListener
没有使用事件命令 JFileChooser.CANCEL_SELECTION 调用
)。我必须对 JFileChooser
做些什么才能使在“取消”按钮上按下“Enter”键等同于单击“取消”按钮?
这是我看到的(错误)行为的一个简单示例:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public final class TestApp {
public static void main(final String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
final JFileChooser chooser = new JFileChooser();
chooser.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
final JFrame frame = new JFrame();
frame.add(chooser);
frame.pack();
frame.setVisible(true);
}
catch (final Throwable t) {
t.printStackTrace();
}
}
});
}
}
要查看(错误)行为,请执行程序,按 Tab 键选择“取消”,然后按“Enter”键。该程序不会在我的平台上终止——尽管当我单击“取消”按钮时它会终止。
扩展 JFileChooser
和覆盖 cancelSelection()
也不起作用(显然,在“取消”按钮)。
(错误)行为发生在我的 Fedora 10 x86_64 系统上,使用 Java 5、6 和 7。
附录:下面添加了一个 KeyEventPostProcessor
到当前的 KeyboardFocusManager
并且看起来像我想要的那样:
import java.awt.Component;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public final class TestApp {
public static void main(final String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
final JFileChooser chooser = new JFileChooser();
chooser.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.out.println(e.paramString());
System.exit(0);
}
});
final KeyboardFocusManager kfm = KeyboardFocusManager
.getCurrentKeyboardFocusManager();
kfm.addKeyEventPostProcessor(new KeyEventPostProcessor() {
@Override
public boolean postProcessKeyEvent(final KeyEvent e) {
if (e.getID() == KeyEvent.KEY_RELEASED
&& e.getKeyCode() == KeyEvent.VK_ENTER) {
final Component comp = e.getComponent();
if (chooser.isAncestorOf(comp)) {
if (!(comp instanceof JButton)) {
chooser.approveSelection();
}
else {
final JButton button = (JButton) comp;
if ("Cancel".equals(button.getText())) {
chooser.cancelSelection();
}
else {
chooser.approveSelection();
}
}
}
}
return false;
}
});
final JFrame frame = new JFrame();
frame.add(chooser);
frame.pack();
frame.setVisible(true);
}
catch (final Throwable t) {
t.printStackTrace();
}
}
});
}
}
然而,这似乎需要做很多工作,才能区分是在“取消”按钮上按下回车键还是在其他任何地方按下回车键。
你发现它有什么问题吗?
发现的解决方案:将 GUI 外观设置为我的系统 (Linux) 的 native 外观和感觉可以满足我的要求,无需任何其他操作。这就是我所不知道的,也是我一直在寻找的。解决方案是有以下内容
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
作为 main()
方法的第一个可执行语句。然后可以省去所有焦点监听器、关键事件处理器等。
我已将 100 分奖励给最有帮助的受访者。
最佳答案
The program doesn't terminate on my platform.
我看到 Mac OS X 10.5、Ubuntu 10 和 Windows 7 使用(各种)Java 5 和 6 正常运行。我用 println()
替换了你的 exit()
> 查看事件:
System.out.println(rootDirChooser.getSelectedFile().getName() + e.paramString());
指定您的平台和版本可能会有所帮助;如果可能,还要验证安装是否正确。
我不确定我是否理解您的目标;但是,作为替代方案,请考虑覆盖 approveSelection()
:
private static class MyChooser extends JFileChooser {
@Override
public void approveSelection() {
super.approveSelection();
System.out.println(this.getSelectedFile().getName());
}
}
附录:
The goal is to have the action of hitting the "Enter" key while on the "Cancel" button be identical to clicking on the "Cancel" button.
如 Key Bindings 中所述,您可以更改与 VK_ENTER
关联的操作。
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
InputMap map = chooser.getInputMap(JFileChooser.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
map.put(enter, "cancelSelection");
如果您希望更改仅在“取消”按钮具有焦点时发生,您需要在 Focus Listener 中执行此操作.
附录:
I found a solution that uses
KeyboadFocusManager
, instead. What do you think?
我可以看到每种方式的优缺点,所以我在下面概述了这两种方式。使用 KeyboadFocusManager
查找所有按钮,但不提供独立于语言环境的方法来区分它们; Focus Listener
方法只能看到批准按钮,并且它是特定于 UI 的。尽管如此,您还是可以结合使用这些方法以获得更好的结果。第二意见不会有问题。
附录:
我更新了下面的代码,不再需要知道“取消”按钮的本地化名称并使用键绑定(bind)。
import java.awt.EventQueue;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.plaf.metal.MetalFileChooserUI;
public final class FileChooserKeys
implements ActionListener, FocusListener, PropertyChangeListener {
private final JFileChooser chooser = new JFileChooser();
private final MyChooserUI myUI = new MyChooserUI(chooser);
private final KeyStroke enterKey =
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
private void create() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chooser.addActionListener(this);
myUI.installUI(chooser);
myUI.getApproveButton(chooser).addFocusListener(this);
KeyboardFocusManager focusManager =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(this);
frame.add(chooser);
frame.pack();
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.paramString());
}
@Override
public void focusGained(FocusEvent e) {
System.out.println("ApproveButton gained focus.");
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("ApproveButton lost focus.");
}
@Override
public void propertyChange(PropertyChangeEvent e) {
Object o = e.getNewValue();
InputMap map = chooser.getInputMap(
JFileChooser.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
if (o instanceof JButton) {
if ("focusOwner".equals(e.getPropertyName())) {
JButton b = (JButton) o;
String s = b.getText();
boolean inApproved = b == myUI.getApproveButton(chooser);
if (!(s == null || "".equals(s) || inApproved)) {
map.put(enterKey, "cancelSelection");
} else {
map.put(enterKey, "approveSelection");
}
}
}
}
private static class MyChooserUI extends MetalFileChooserUI {
public MyChooserUI(JFileChooser b) {
super(b);
}
@Override
protected JButton getApproveButton(JFileChooser fc) {
return super.getApproveButton(fc);
}
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new FileChooserKeys().create();
}
});
}
}
关于java - 如何在 JFileChooser 中的 "Enter"按钮上点击 "Cancel"后采取行动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3378798/
我已经禁用了回车键,以便可以执行 ajax 提交,但我想确保如果用户在服务器响应返回之前按两次回车键,则表单不会提交两次。 这里我禁用了回车键并为其分配了一个名为 submitForm() 的函数:
我正在尝试将 $animate 服务合并到我自己的指令中。我无法进入并离开以实际设置动画。 奇怪的是,使用$animate.enter,元素附加到DOM,回调函数触发。但似乎从未添加 ng-anima
如果 ,我如何检查 Bash输入 键被按下了? 我正在使用读取命令: read -p "Please press ENTER" var 最佳答案 首先检查退出状态是否正常($?应该为0)。 其次,检查
在我的 PreviewKeyDown() handler 如何区分数字键盘上的 ENTER 键和主板上的 ENTER 键? 两个键返回相同的值 Key.Enter为 KeyEventArgs.Key
这个问题已经有答案了: How do I detect "shift+enter" and generate a new line in Textarea? (19 个回答) 已关闭10 年前。 我正
我的问题与这个 question 有点相关.但是,我没有奢侈去监听 submit 事件,所以这个问题的答案对我来说不起作用。 我的问题:是否可以在 Javascript 中检测日文/中文建议菜单何时打
我希望能够在不需要实现新类的情况下修改 wpf 文本框的行为。 我想要一个类似 Enter/Alt+Enter 行为的 Excel,当用户点击“Enter”时,文本框被验证(movefocus ...
在 Chrome 中的 contenteditable 中按 Enter 时,会插入一个 div。这会干扰我的标记,我需要它成为 br。 我知道shift-enter是一个br。解决问题的最佳方法是什
我正在使用$('.inputs').keydown(function (e) { if (e.which === 13) {到达下一个输入字段。但是每次我按 enter/return 转到下一个输入字
我有一个 textarea ,其中当您单独按 Enter 时,jquery ajax 会启动,但我想添加一个功能,即当您按 Enter + Shift 时仅转到新行并且不启动ajax。你能指导一下吗?
场景如下: 有一个密码字段,我可以在其中输入文本(这是使用 sendKeys 完成的) 现在,没有提交/输入按钮 所以我必须按 Enter 键并登录应用程序 以下是我搜索并尝试但没有成功的几种方法:
这是我尝试过的,但显然失败了: ed.on('keyup', function(e){ console.log(e.keyCode) if(e.keyCode == 13 && !e.
所以我有一个带有 jQuery 的表单,可以阻止用户使用 Enter 键提交表单。 这是代码: $(document).ready(function() { // code prevent
有人知道如何在Javascript中检测按键代码“+1 Enter”和“-1 Enter”吗?我想检测何时一一按下键码而不是一次按下键码。 但是当我编写以下代码时,没有给出任何效果。 // +1 en
我想添加 shift + enter 键转到下一行,只需 enter 键 即可使用 JAVASCRIPT 触发提交按钮仅。 如何实现? 我也想提交多行文本......提前致谢 function typ
int DisplaySchedule() { int nDisplaySchedule_Choice; system("cls"); printf("----- DISPLA
在 textarea 中,当用户按下 Shift+Enter 时,它应该在下一个新行继续,当他简单地按下 Enter 时,它应该提交表单而不使用提交按钮。 这是 Fiddle!! 我浏览了很多但对我没
我有以下简单的 我还有以下 jQuery/JavaScript 代码块: $('textarea#streamWriter').keydown(function (e) { if (e.k
我有许多将转换为HTML的Word文档。要求单词文档中的段落应转换为元素。 在使用Microsoft Office API的SaveAs方法进行了一些测试以将文档转换为HTML之后,我意识到带有手动换
终端是否可以检测 ⇧ Shift+Enter↵ 或 Ctrl+Enter↵ 按键? 我正在尝试配置 vim 来执行使用这些序列的键映射,虽然它们在 gvim 中工作正常,但它们似乎在任何终端控制台中都
我是一名优秀的程序员,十分优秀!