Java 如何专注于BorderLayout中特定JPanel上的键盘处理
在获取小部件焦点以启用Java Swing BorderLayout面板中的键盘处理方面,我遇到了一些问题。我能够获得北面板的焦点,然后我的键盘处理程序就会启动。但是,如果我尝试为布局的南面板或中心面板请求焦点,它根本不起作用。唯一似乎能够获得焦点的小组是北小组。有人知道为什么吗?这是按边界布局设计的吗 现在,我尝试从各种面板拾取焦点的原因是,出于某种原因,当焦点设置到北面板时,似乎每隔一段时间键盘处理程序设置为在某些键上注册输入似乎根本不会启动。几乎就好像他们不在那里。所以我想我会简单地使用布局中的另一个面板作为键盘输入的焦点,看看会发生什么,现在看来这个选项也不起作用 有人有什么想法吗Java 如何专注于BorderLayout中特定JPanel上的键盘处理,java,swing,Java,Swing,在获取小部件焦点以启用Java Swing BorderLayout面板中的键盘处理方面,我遇到了一些问题。我能够获得北面板的焦点,然后我的键盘处理程序就会启动。但是,如果我尝试为布局的南面板或中心面板请求焦点,它根本不起作用。唯一似乎能够获得焦点的小组是北小组。有人知道为什么吗?这是按边界布局设计的吗 现在,我尝试从各种面板拾取焦点的原因是,出于某种原因,当焦点设置到北面板时,似乎每隔一段时间键盘处理程序设置为在某些键上注册输入似乎根本不会启动。几乎就好像他们不在那里。所以我想我会简单地使用布
谢谢 如果要从所有可以使用的组件获取键盘输入 如果是,north将接收关键事件,因此您可以强制特定面板具有焦点,并通过将所有其他面板设置为非焦点来接收关键事件。将JTextField或JButton(仅测试组件)添加到north面板会打破这一点。不是直接的答案,但我无法在注释中发布代码 是否有方法转储或显示所有已注册的密钥绑定,以验证它们是否以某种方式被取消注册 我用的是
import java.awt.EventQueue;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.KeyStroke;
public class KeyMappings {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// try {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
// ex.printStackTrace();
// }
getKeyBindingsFor(new JTree());
}
});
}
public static void getKeyBindingsFor(JComponent comp) {
System.out.println("...WHEN_ANCESTOR_OF_FOCUSED_COMPONENT");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT));
System.out.println("...WHEN_FOCUSED");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_FOCUSED));
System.out.println("...WHEN_IN_FOCUSED_WINDOW");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW));
}
public static void getKeyBindingsFor(InputMap map) {
if (map != null) {
KeyStroke[] keys = map.allKeys();
if (keys != null) {
for (KeyStroke key : keys) {
Object value = map.get(key);
System.out.println(value + " = " + key);
}
} else {
System.out.println("[none]");
}
}
}
}
要测试不同组件的各种绑定以及外观和感觉很抱歉,但是如果没有代码,我们最多只能胡乱猜测。有些可能达到了目标,但也可能是命中或未命中。为什么不发布相关的代码,最好是a,让我们能够自信地回答好问题?另外,我敢打赌,99%的问题都可以通过使用键绑定而不是键侦听器来解决。简短的回答是可以的,我使用的是键绑定。这里似乎有一个“焦点”问题。在我的北面板和南面板中,我使用JTextFields来显示数据。对JTextField的更新是否会无意中改变北面板的焦点,我将失去检测击键的能力?1。如果JTextFields仅用于显示,不应获取焦点,则将其设置为不可聚焦。2.一个多小时前我已经请求了相关代码——请在这里帮助我们遵守。你的意思是说有一个JTextField的JButton可以获得焦点,破坏了对另一个面板进行显式聚焦的能力,我希望独占使用键盘?如果我将JTextField设置为Noneditable,这是否适用?@user1104028一次只能有一个组件具有键盘焦点,这是我们通常推荐键绑定的众多原因之一API@MadProgrammer-是否有方法转储或显示所有已注册的密钥绑定,以验证它们是否以某种方式未被注销?
import java.awt.EventQueue;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.KeyStroke;
public class KeyMappings {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// try {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
// ex.printStackTrace();
// }
getKeyBindingsFor(new JTree());
}
});
}
public static void getKeyBindingsFor(JComponent comp) {
System.out.println("...WHEN_ANCESTOR_OF_FOCUSED_COMPONENT");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT));
System.out.println("...WHEN_FOCUSED");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_FOCUSED));
System.out.println("...WHEN_IN_FOCUSED_WINDOW");
getKeyBindingsFor(comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW));
}
public static void getKeyBindingsFor(InputMap map) {
if (map != null) {
KeyStroke[] keys = map.allKeys();
if (keys != null) {
for (KeyStroke key : keys) {
Object value = map.get(key);
System.out.println(value + " = " + key);
}
} else {
System.out.println("[none]");
}
}
}
}