- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个实现 KeyListener 和 FocusListener 接口(interface)的类。两者都不起作用,但如果我不通过注释或删除以下内容来添加 JButton:add(whiteJButton)
,那么它们就可以工作。有人可以向我解释为什么会发生这种情况吗?提前致谢。
import java.awt.Color;
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.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JFrames {
public static void main(String[] args) {
JFrame myJFrame = new JFrame("MyJFrame");
myJFrame.setBounds(400, 400, 500, 500);
myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyJPanel myJPanel = new MyJPanel();
myJFrame.add(myJPanel);
// Doesn't work
myJFrame.addKeyListener(new MyKeyListener());
// Doesn't work
myJFrame.addFocusListener(new MyFocusListener());
myJFrame.setVisible(true);
}
static class MyJPanel extends JPanel {
public MyJPanel() {
JButton whiteJButton = new JButton("WHITE");
add(whiteJButton);
whiteJButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setBackground(Color.WHITE);
}
});
}
}
}
class MyKeyListener implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("keyTyped: " + e.getKeyChar());
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("keyPressed: " + e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased: " + e.getKeyChar());
}
}
class MyFocusListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
System.out.println("focusGained");
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("focusLost");
}
}
最佳答案
问题在于该按钮从 JFrame 窃取了焦点,从而阻止焦点监听器工作(焦点已经消失)。如果您绝对需要使用 KeyListener,则一些解决方案是拼凑而成,包括使 JButton 不可聚焦:whiteJButton.setFocusable(false);
,但如果您这样做,则需要为 执行此操作添加了所有组件。是的,您可以按照其他答案的建议请求焦点,但它应该是 requestFocusInWindw()
,而不是 requestFocus()
(许多类似的问题解释了为什么会这样)。如果你这样做并且组件仍然可以聚焦,那么如果组件获得焦点,整个事情就会崩溃——这不好。
更好(根据评论)是使用 Key Bindings如果您使用正确的输入映射,则不需要焦点即可工作。请注意,键绑定(bind)是 Swing 本身捕获组件击键的方式,因此使用它会遵循 Swing 的一般结构和契约。键绑定(bind)的问题是您必须绑定(bind)要捕获的每个键,但您可以使用 for 循环来协助完成此操作。
另一个解决方案是使用 KeyEventDispatcher 来进行键盘焦点管理器:
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
// code goes here
return false;
}
});
使用键绑定(bind)的示例:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class KeyboardFun extends JPanel {
private InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
private ActionMap actionMap = getActionMap();
public KeyboardFun() {
setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
setLayout(new GridLayout(0, 8, 3, 3));
for (char c = 'A'; c <= 'Z'; c++) {
final String text = String.valueOf(c);
JButton button = new JButton(text);
button.addActionListener(e -> {System.out.println("Key pressed: " + text);});
add(button);
setBinding(c, button);
}
}
private void setBinding(char c, final JButton button) {
KeyStroke keyStroke = KeyStroke.getKeyStroke(Character.toLowerCase(c));
inputMap.put(keyStroke, keyStroke.toString());
actionMap.put(keyStroke.toString(), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
button.doClick();
}
});
}
private static void createAndShowGui() {
KeyboardFun mainPanel = new KeyboardFun();
JFrame frame = new JFrame("KeyboardFun");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
关于如果我添加 JButton,Java FocusListener 和 KeyListener 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59018108/
我目前正在研究我们小组第一学期考试项目的 GUI 部分,我遇到了一个关于回调和事件处理的奇怪问题。 有点偏离主题:我已经用谷歌搜索了这个问题,但确实找不到任何在 Java 中使用回调的具体示例,所以从
我正在尝试将 focusListener 添加到 JDateChooser,以便当用户选择 dateOfBirth 时,当焦点丢失时,它会在文本字段上显示年龄。但它不起作用这是我尝试过的方法, 导入j
我有一个 JFrame,我想在用户单击它时将其关闭。我有两个 JTextFields 和一个 JButton(用户名、密码、提交)。当我为他们提供所有 FocusListener 时,只要用户从一个字
我必须扩展一些代码来实现一个 ActionListener,该监听器使用 ActionCommands 来获取有关触发 ActionEvent 的组件所属对象的更多信息。 同一段代码现在还应该实现 F
我在 JFrame 中有 2 个文本字段,当焦点从 textfield1 丢失时,我想验证 textfield1 中的数据。因此,我在 FocusLost() 方法中使用了 FocusListener
我一直在研究有关 JInternalFrames 的各种问题,并尝试按照建议实现代码,但我似乎做错了一些事情。我在这里包含的代码将演示我的问题。三个框架已创建,但当您单击并移动它们时,它们不会按预期到
有一个 SWT 文本框。我正在为其设置默认文本。 设置焦点监听器,以便当焦点位于文本框上时,删除默认文本。 设置验证监听器以确保仅输入字母。 但是,当焦点设置在文本框上时,文本不会设置为空。是什么导致
在我的代码中,当我尝试将 FocusListener 添加到 JTextField 时,它说 ChatClient.java:30: error: incompatible types: ChatCl
我有一个文本字段,我必须在其中验证电子邮件。我的问题是,我只想在电子邮件有效时将焦点从文本字段移开。我现在使用 FocusAdapter。有人可以给我一些其他的想法吗? 最佳答案 参见javax.sw
我有 JTextField。我需要保存更改,如果用户在其中写了一些东西然后失去了焦点(比如点击其他地方) mMaxLabelLength = new JTextField(); mMaxLabelLe
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.ne
我创建了一个使用 FocusListener 来确保文本字段的值始终为正的应用程序。当用户输入负值,然后单击“tab”键将焦点从文本字段移开时,该值将乘以-1,从而得到正值。但是,当我运行该应用程序时
一些背景:我是一个相当有经验的 C++ 程序员,但我目前正在自学 Java。 我有一个包含多个 JTextField 的应用程序,我希望在单击某个字段时突出显示该字段的内容。我知道我可以为每个人编写一
我有以下代码: Display display = new Display(); Shell shell = new Shell(display); s
首先:抱歉,我无法提供 SSCCE。我试图在一个小项目上重现这个问题,但没有成功,或者我应该说成功了,因为它在那里工作! 所以这是我的问题:我有一个可编辑的 JCombobox,它应该通过单击编辑器组
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我有一个文本框,我想在文本框获得焦点时显示一个对话框。所以我写了以下代码。但是当对话框被处理后,对话框会再次出现。我尝试使用换行符进行调试和检查。那次它不会执行多次,但在正常模式下它会执行多次,因此对
因此,当我单击 JTextfield 中的一个时,我想setText一个名为value的字符串。我读到有关将 FocusListener 添加到 JTextField 的内容,但找不到有关将其添加到
我有两个实现 KeyListener 和 FocusListener 接口(interface)的类。两者都不起作用,但如果我不通过注释或删除以下内容来添加 JButton:add(whiteJBut
我的 Java 应用程序中有数百个 JTextFields,我想在所有这些上添加 FocusListener 以设置文本的水平对齐并在每个文本字段上添加 FocusListener。所以,我做了这个方
我是一名优秀的程序员,十分优秀!