界面设计之swing实现软键盘


原理:

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                   
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值