注册了"SPACE"和"已发布的SPACE"的键绑定,当空格是唯一按下/释放的键时,我按照广告说明,按下空格,然后按ctrl(或任何其他修改键),然后释放空格,最后释放ctrl将导致执行与"SPACE"关联的操作,但不会执行与"已释放的SPACE"关联的操作.
一旦不再按空格(或同时按下修改键),导致动作执行的首选方法是什么?我只在Windows 7,64位上试过这个.
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()); …Run Code Online (Sandbox Code Playgroud) Builder实现Cloneable并覆盖clone(),而不是复制构建器的每个字段,不可变类保留构建器的私有克隆.这样可以轻松返回新构建器并创建不可变实例的略微修改的副本.
这样我就可以了
MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();
Run Code Online (Sandbox Code Playgroud)
据说Cloneable接口有点坏了,但是这有什么违反了良好的java编码习惯,这个构造有什么问题吗?
final class MyImmutable {
public int foo() { return builder.foo; }
public int bar() { return builder.bar; }
public Builder builder() { return builder.clone(); }
public static final class Builder implements Cloneable {
public Builder foo(int val) { foo = val; return this; }
public Builder bar(int val) { bar = val; return this; }
public MyImmutable build() { return new MyImmutable(this.clone()); }
private int foo = 0; …Run Code Online (Sandbox Code Playgroud)