我在JFrame
的根窗格註冊了一個事件,該窗格在按下空格鍵(打開另一個窗口)時會作出反應。我在這個JFrame裏面也有一個JTextField
。當用戶處於我的文本字段的編輯模式並擊中空格鍵時,空間事件只能被文本字段消耗,不會被轉發到JFrame
的動作圖。在JTextField中點擊空格鍵會觸發父窗口的鍵綁定
我該怎麼做?
這是問題的一個可運行的演示:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
public class TestDialog {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaceAction");
frame.getRootPane().getActionMap().put("spaceAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("spaceAction");
}
});
JTextField tf = new JTextField("textfield");
JLabel label = new JLabel("otherComponent");
label.setFocusable(true);
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(tf);
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}
你使用了什麼InputMap級別?也許考慮提供一個演示你的問題的可運行示例 – MadProgrammer
添加了一個演示應用程序 – trainrobbery
我嘗試了所有3個InputMap級別,它們按預期工作(ancestor_of_focussed_comp,when_in_focussed_window,when_focussed),前兩個按我描述的工作,第三級別不起作用根本沒有,因爲根窗格不能有焦點,不應該 – trainrobbery