Java Swing快捷鍵和按鍵綁定

1. 快捷鍵和助記符

設置Save菜單選項的快捷鍵爲Ctrl+S:

JMenuItem save = new JMenuItem("Save");
save.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,
                                           java.awt.Event.CTRL_MASK));
設置File和Save的助記符:

JMenu file = new JMenu("File");
file.setMnemonic('F');
JMenuItem save = new JMenuItem("Save");
save.setMnemonic('S');            // Always use a capital letter
file.add(save);

http://docstore.mik.ua/orelly/java-ent/jfc/ch03_08.htm


2. ActionMap()和InputMap()例子

1).

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestBindKey
{
 JFrame jf=new JFrame("測試");
 JTextArea ta=new JTextArea(3,30);
 JButton bt=new JButton("發送");
 JTextField tf=new JTextField(15);
 public void init()
 {
  jf.add(ta);
  JPanel jp=new JPanel();
  jp.add(tf);
  jp.add(bt);
  jf.add(jp,BorderLayout.SOUTH);

  AbstractAction sendMsg=new AbstractAction()
  {
   public void actionPerformed(ActionEvent e)
   {
    ta.append(tf.getText()+"\n");
    tf.setText("");
   }
  };

  bt.addActionListener(sendMsg);
  //將Ctrl+Enter鍵和“send”關聯
  tf.getInputMap().put(KeyStroke.getKeyStroke('\n',java.awt.event.InputEvent.CTRL_MASK),"send");
  //將"send"和sendMsg Action關聯

  tf.getActionMap().put("send",sendMsg);
  
  jf.pack();
  jf.setVisible(true);
  
 }
 public static void main(String[] args)
 {
  new TestBindKey().init();
  System.out.println("ActionMap and InputMap!");
 }
}

2).

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.text.JTextComponent;

public class KeyBinding {
  public static void main(String[] argv) {
	JFrame frame = new JFrame(" Adding an InputMap to a Component");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	JPanel panel = new JPanel();  
	JTextArea area = new JTextArea(7,10);
	JScrollPane pane = new JScrollPane(area);
	  
    InputMap im = area.getInputMap(JComponent.WHEN_FOCUSED);
    im.put(KeyStroke.getKeyStroke("F2"), "actionName");

    ActionMap am = area.getActionMap();
    am.put("actionName", new AbstractAction("actionName") {
      public void actionPerformed(ActionEvent evt) {
        //System.out.println((JTextComponent) evt.getSource());
    	  System.out.println("action1"+ evt.getID());
      }
    });
    im.put(KeyStroke.getKeyStroke("F3"), "actionName2");
    am.put("actionName2", new AbstractAction("actionName2") {
      public void actionPerformed(ActionEvent evt) {
        //System.out.println((JTextComponent) evt.getSource());
    	  System.out.println("action2"+ evt.toString());
      }
    });
    JButton component1 = new JButton("button 1");
    JButton component2 = new JButton("button 2");

    component1.setInputMap(JComponent.WHEN_FOCUSED, im);
    component2.setInputMap(JComponent.WHEN_FOCUSED, im);

    component1.setActionMap(am);
    component2.setActionMap(am);

    panel.add(pane);
    panel.add(component1);
    panel.add(component2);
    frame.add(panel);
    frame.setSize(400,200);
    frame.setVisible(true);

  }
}

3).

import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.*;
import java.awt.*;

public class InputMapComponents{
  JFrame frame;
  JPanel panel;
  JLabel label;
  JTextArea area;
  JScrollPane pane;
  InputMap map;
  //ActionMap map;
  public static void main(String[] args) {
  InputMapComponents m = new InputMapComponents();
  }
  public InputMapComponents(){
  frame = new JFrame(" Adding an InputMap to a Component");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  panel = new JPanel();  
  area = new JTextArea(7,10);
  pane = new JScrollPane(area);
  map = area.getInputMap();
  System.out.println(map);
  //map = area.getActionMap();
  KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.cutAction);
  //map.put(key, action)
  key = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.copyAction);
  key = KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.pasteAction);
  key = KeyStroke.getKeyStroke(KeyEvent.VK_L, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.backwardAction);
  key = KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.forwardAction);
  key = KeyStroke.getKeyStroke(KeyEvent.VK_U, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.upAction);
  key = KeyStroke.getKeyStroke(KeyEvent.VK_D, Event.CTRL_MASK);
  map.put(key, DefaultEditorKit.downAction);
  String lbl = "<html><b>" + "Ctrl+p = paste" 
+ "<br>" + "Ctrl+y = copy" + 
"<br>" + "Ctrl+c = cut" + "<br>"
 + "Ctrl+l = cursor shift left one character" 
+ "<br>" + "Ctrl+r = cursor shift right one character" + "<br>"
 + "Ctrl+u = cursor shift up one line" + "<br>" 
+ "Ctrl+d = cursor shift down one line" + "</b></html>";
  JLabel label = new JLabel(lbl);
  panel.add(pane);
  panel.add(label);
  frame.add(panel);
  frame.setSize(400,200);
  frame.setVisible(true);
  
  }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章