原理:
1、焦点控制,软件盘的组件需要设置为不可获取焦点
2、键盘事件模拟,使用Robot模拟按钮事件
3、使用JPopup作为弹出窗口的容器
import com.sun.glass.events.KeyEvent;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @author joe
*/
public class NumberInputPnl extends javax.swing.JPanel {
private Map<String, Integer> keyCodeMap;
private Robot robot;
private Action clickAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
Integer code = keyCodeMap.get(b.getName());
if (code != null) {
robot.keyPress(code);
robot.keyRelease(code);
}
}
};
/**
* Creates new form NumberInputPnl
*/
public NumberInputPnl() {
initComponents();
this.setFocusable(false);
try {
robot = new Robot();
} catch (AWTException ex) {
Logger.getLogger(NumberInputPnl.class.getName()).log(Level.SEVERE, null, ex);
}
keyCodeMap = new HashMap<String, Integer>();
for (int i = 0; i < 10; i++) {
keyCodeMap.put(String.valueOf(i), KeyEvent.VK_0 + i);
}
keyCodeMap.put("+", KeyEvent.VK_ADD);
keyCodeMap.put("-", KeyEvent.VK_SUBTRACT);
keyCodeMap.put(".", KeyEvent.VK_DECIMAL);
keyCodeMap.put("<-", KeyEvent.VK_BACKSPACE);
keyCodeMap.put("--", KeyEvent.VK_F3);
keyCodeMap.put("++", KeyEvent.VK_F4);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame("二维码生成");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new NumberInputPnl());
f.pack();
f.setVisible(true);
}
});
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
_1btn = new javax.swing.JButton();
_2btn = new javax.swing.JButton();
_3btn = new javax.swing.JButton();
plusBtn = new javax.swing.JButton();
_4btn = new javax.swing.JButton();
_5btn = new javax.swing.JButton();
_6btn = new javax.swing.JButton();
substractBtn = new javax.swing.JButton();
_7btn = new javax.swing.JButton();
_8btn = new javax.swing.JButton();
_9btn = new javax.swing.JButton();
decimalBtn = new javax.swing.JButton();
_0btn = new javax.swing.JButton();
jButton14 = new javax.swing.JButton();
jButton15 = new javax.swing.JButton();
jButton16 = new javax.swing.JButton();
setLayout(new java.awt.GridLayout(4, 4));
_1btn.setAction(clickAction);
_1btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_1btn.setText("1");
_1btn.setFocusable(false);
_1btn.setName("1"); // NOI18N
add(_1btn);
_2btn.setAction(clickAction);
_2btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_2btn.setText("2");
_2btn.setFocusable(false);
_2btn.setName("2"); // NOI18N
add(_2btn);
_3btn.setAction(clickAction);
_3btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_3btn.setText("3");
_3btn.setFocusable(false);
_3btn.setName("3"); // NOI18N
add(_3btn);
plusBtn.setAction(clickAction);
plusBtn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
plusBtn.setText("+");
plusBtn.setFocusable(false);
plusBtn.setName("+"); // NOI18N
add(plusBtn);
_4btn.setAction(clickAction);
_4btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_4btn.setText("4");
_4btn.setFocusable(false);
_4btn.setName("4"); // NOI18N
add(_4btn);
_5btn.setAction(clickAction);
_5btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_5btn.setText("5");
_5btn.setFocusable(false);
_5btn.setName("5"); // NOI18N
add(_5btn);
_6btn.setAction(clickAction);
_6btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_6btn.setText("6");
_6btn.setFocusable(false);
_6btn.setName("6"); // NOI18N
add(_6btn);
substractBtn.setAction(clickAction);
substractBtn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
substractBtn.setText("-");
substractBtn.setFocusable(false);
substractBtn.setName("-"); // NOI18N
add(substractBtn);
_7btn.setAction(clickAction);
_7btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_7btn.setText("7");
_7btn.setFocusable(false);
_7btn.setName("7"); // NOI18N
add(_7btn);
_8btn.setAction(clickAction);
_8btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_8btn.setText("8");
_8btn.setFocusable(false);
_8btn.setName("8"); // NOI18N
add(_8btn);
_9btn.setAction(clickAction);
_9btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_9btn.setText("9");
_9btn.setFocusable(false);
_9btn.setName("9"); // NOI18N
add(_9btn);
decimalBtn.setAction(clickAction);
decimalBtn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
decimalBtn.setText(".");
decimalBtn.setFocusable(false);
decimalBtn.setName("."); // NOI18N
add(decimalBtn);
_0btn.setAction(clickAction);
_0btn.setFont(new java.awt.Font("宋体", 1, 30)); // NOI18N
_0btn.setText("0");
_0btn.setFocusable(false);
_0btn.setName("0"); // NOI18N
add(_0btn);
jButton14.setAction(clickAction);
jButton14.setText("退格(<-)");
jButton14.setFocusable(false);
jButton14.setName("<-"); // NOI18N
add(jButton14);
jButton15.setAction(clickAction);
jButton15.setText("加数量");
jButton15.setFocusable(false);
jButton15.setName("++"); // NOI18N
add(jButton15);
jButton16.setAction(clickAction);
jButton16.setText("减数量");
jButton16.setFocusable(false);
jButton16.setName("--"); // NOI18N
add(jButton16);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JButton _0btn;
private javax.swing.JButton _1btn;
private javax.swing.JButton _2btn;
private javax.swing.JButton _3btn;
private javax.swing.JButton _4btn;
private javax.swing.JButton _5btn;
private javax.swing.JButton _6btn;
private javax.swing.JButton _7btn;
private javax.swing.JButton _8btn;
private javax.swing.JButton _9btn;
private javax.swing.JButton decimalBtn;
private javax.swing.JButton jButton14;
private javax.swing.JButton jButton15;
private javax.swing.JButton jButton16;
private javax.swing.JButton plusBtn;
private javax.swing.JButton substractBtn;
// End of variables declaration
}