Có các ràng buộc khóa đã đăng ký cho "SPACE" và "SPACE được phát hành" hoạt động như được quảng cáo khi không gian là phím duy nhất được nhấn/phát hành, tôi nhận thấy không gian nhấn, sau đó nhấn ctrl (hoặc bất kỳ phím bổ trợ nào khác), sau đó giải phóng không gian và cuối cùng phát hành ctrl sẽ gây ra hành động liên quan đến "SPACE" được thực hiện, nhưng không phải hành động liên quan đến "SPACE được phát hành".ràng buộc chìa khóa java swing - thiếu hành động cho khóa được phát hành
Cách ưa thích để thực hiện hành động khi không gian được nhấn nữa (hoặc phím bổ trợ được nhấn đồng thời)? Tôi chỉ thử điều này trên Windows 7, 64-bit.
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.AbstractAction;
import javax.swing.KeyStroke;
import java.awt.event.ActionEvent;
import java.awt.Cursor;
class Bind extends JPanel {
{
getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
getInputMap().put(KeyStroke.getKeyStroke("released SPACE"), "released");
getActionMap().put("pressed", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println("pressed");
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
});
getActionMap().put("released", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println("released");
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
JFrame f = new JFrame("Key Bindings");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Bind());
f.setSize(640, 480);
f.setVisible(true);
}
});
}
}
CẬP NHẬT: Đây là cách để tránh không gian dính khi vô tình nhấn Ctrl, Alt hoặc Shift trước khi thả không gian:
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.AbstractAction;
import javax.swing.KeyStroke;
import java.awt.event.ActionEvent;
import java.awt.Cursor;
class Bind extends JPanel {
{
getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
getInputMap().put(KeyStroke.getKeyStroke("released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("ctrl released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("shift released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("shift ctrl released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("alt released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("alt ctrl released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("alt shift released SPACE"), "released");
getInputMap().put(KeyStroke.getKeyStroke("alt shift ctrl released SPACE"), "released");
getActionMap().put("pressed", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println("pressed");
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
});
getActionMap().put("released", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println("released");
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
JFrame f = new JFrame("Key Bindings");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Bind());
f.setSize(640, 480);
f.setVisible(true);
}
});
}
}
Để được trợ giúp tốt hơn sớm hơn, hãy đăng [SSCCE] (http://sscce.org/). –
[SSCCE] (http://sscce.org/) được thêm vào để được trợ giúp tốt hơn sớm hơn :-) – Aksel
OK .. Đó là một câu hỏi rất hay. Tôi nhìn thấy hành vi mà bạn mô tả (trong 32 bit Win 7), nhưng không có ý tưởng làm thế nào để sửa chữa nó. Hy vọng rằng một trong những bậc thầy quan trọng ràng buộc sẽ xảy ra bởi .. mùa đông. :) –