java介面編程(4),java介面編程

來源:互聯網
上載者:User

java介面編程(4),java介面編程

本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020

  在Swing的事件模型中,組件可以發起(觸發)一個事件。每種事件的類型由不同的類表示,當事件被觸發時,它將被一個或多個“監聽器”接收,監聽器負責處理事件。所以,事件發生的地方可以與事件處理的地方分離開。既然是以這種方式使用Swing組件,那麼就只需要編寫組件收到事件時將被調用的代碼。所謂事件監聽器,就是一個“實現特定類型的監聽器介面”類對象。

  下面,就以一個尋找Swing組件裡的addListener的例子來示範Swing事件模型,完整代碼如下:

public class ShowAddListeners extends JFrame {private JTextField name = new JTextField(18);private JButton search = new JButton("查詢");private JTextArea results = new JTextArea(30,50);//定義Regex匹配addListenerprivate static Pattern addListener = Pattern.compile("(add\\w+?Listener\\(.*?\\))");private static Pattern qualifier = Pattern.compile("\\w+\\.");public ShowAddListeners(){setVisible(true);setSize(600, 400);JPanel top = new JPanel();top.add(new JLabel("Swing Class name(press Enter):"));top.add(name);top.add(search);add(BorderLayout.NORTH,top);add(new JScrollPane(results));//設定不可編輯//results.setEditable(false);search.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent event) {// TODO Auto-generated method stub//去掉關鍵字的前後空格String nm = name.getText().trim();//如果去掉關鍵字後長度為為,則顯示沒有匹配成功的if(nm.length() == 0){results.setText("no match!");return;}Class<?> kind;try {kind = Class.forName("javax.swing."+nm);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blockresults.setText("no match!");return;}Method[] methods = kind.getMethods();results.setText("");for(Method m : methods){Matcher matcher = addListener.matcher(m.toString());//如果找到了匹配的方法,則輸出if(matcher.find()){results.append(qualifier.matcher(matcher.group(1)).replaceAll("")+"\n");}}}});}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubnew ShowAddListeners();}}
  效果:

      這裡面主要用到了Regex用於匹配相應的監聽器,這裡只是用到了一個監聽器接收,上面也提到了,組件也可以綁定多個監聽器。

  下面就實現JButton的幾個重要的事件監聽器,分別是FocusListener、KeyListener、MouseListener和MouseMotionListener
,給按鈕綁定這些監聽器,當對應的事件發生時,觸發相應的事件,從而執行對應的操作,完整代碼如下:

public class TrackEvent extends JFrame {private HashMap<String,JTextField> map = new HashMap<String,JTextField>();private String[] event = {"focusGained","focusLost","keyPressed","keyReleased","keyTyped","mouseClicked","mouseEntered","mouseExited","mousePressed","mouseReleased","mouseDragged","mouseMoved"};private MyButton b1 = new MyButton(Color.BLUE,"test1");private MyButton b2 = new MyButton(Color.RED,"test2");class MyButton extends JButton{private void report(String field,String msg){map.get(field).setText(msg);}private FocusListener fl = new FocusListener() {@Overridepublic void focusLost(FocusEvent e) {// TODO Auto-generated method stubreport("focusLost",e.paramString());}@Overridepublic void focusGained(FocusEvent e) {// TODO Auto-generated method stubreport("focusGained",e.paramString());}};private KeyListener kl = new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stubreport("keyTyped",e.paramString());}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stubreport("keyReleased",e.paramString());}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubreport("keyPressed",e.paramString());}};private MouseListener ml = new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stubreport("mouseReleased",e.paramString());}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubreport("mousePressed",e.paramString());}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stubreport("mouseExited",e.paramString());}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stubreport("mouseEntered",e.paramString());}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubreport("mouseClicked",e.paramString());}};private MouseMotionListener mml = new MouseMotionListener() {@Overridepublic void mouseMoved(MouseEvent e) {// TODO Auto-generated method stubreport("mouseMoved",e.paramString());}@Overridepublic void mouseDragged(MouseEvent e) {// TODO Auto-generated method stubreport("mouseDragged",e.paramString());}};public MyButton(Color color,String label) {super(label);setBackground(color);addFocusListener(fl);addKeyListener(kl);addMouseListener(ml);addMouseMotionListener(mml);}}public TrackEvent() {// TODO Auto-generated constructor stubsetLayout(new GridLayout(event.length + 1,2));for(String evt : event){JTextField tf = new JTextField();tf.setEditable(false);add(new JLabel(evt,JLabel.RIGHT));add(tf);setSize(700,500);setVisible(true);map.put(evt, tf);}add(b1);add(b2);}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubnew TrackEvent();}});}}
  執行結果:


  這樣,按一下滑鼠按鈕,拖動按鈕,移動按鈕等事件發生時,就會觸發相應的監聽器,從而將事件的動作以字串的形式顯示在JTextField中,即組件跟蹤多個事件。





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.