2014-09-02 417 views
1

我不知道如何將Actionlisteners添加到JButton s,任何幫助將不勝感激。試圖添加ActionListener到JButtons

public class Translator extends JPanel implements MouseListener, ActionListener {  

    private JButton french = new JButton(); 
    private JButton german = new JButton(); 
    private JButton irish = new JButton(); 

    public Translator(){ 
     french = new JButton("French"); 
     german = new JButton("German"); 
     irish = new JButton("Irish");   
     setLayout(new GridLayout(2,1));   
     buttonPanel.setLayout(new GridLayout(1,3)); 
     buttonPanel.add(french); 
     buttonPanel.add(german); 
     buttonPanel.add(irish); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
} 
+2

'buttonName.addActionListener(this);' – 2014-09-02 15:28:11

回答

1
french.addActionListener(an_instance_of_the_class_where_actionPerformed_is); 

其中,因爲我可以編輯看到後,會this

另請參閱this Example並在網絡的這個角落一些教程文本

我認爲參考到教程和許多例子是高度相關的。

0
JButton button = new JButton("Button"); 
button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     //To-Do 
     //Button clicked 
     }); 

希望這會有所幫助,它相對簡單!你只需要一個ActionListener添加到您所需的JButton

爲了給你如何實現它的情況下,場景更廣闊的想法,我想按下一個按鈕後運行一個新的GUI框架:

startNewFrame.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Starting new frame"); 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        NewFrame newFrame = new NewFrame(); 
        newFrame.setVisible(true); 
        dispose();//Disposes of current frame 
       } 
      }); 
     } 
    }); 
1
button.addActionListener(<your_ActionListener_here>); 

在你的情況,這將是:

french.addActionListener(this); 

如果你想使用所有這三個按鈕相同的ActionListener,可以使用動作事件e的的getSource()函數來檢測W¯¯這個按鈕實際上是按下的。

1

如果您使用的是Java8,您可以試試這個。

JButton french = new JButton("French"); 
french.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent ae){ 
     System.out.println("Button french clicked!"); 
    } 
}); 
french.addActionListener(button -> System.out.println("Button Click listener...")); 
JFrame frame = new JFrame("Button Listener Test"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.add(french, BorderLayout.CENTER); 
frame.setSize(250, 250); 
frame.setVisible(true); 
+2

最好不要將'ActionEvent'變量命名爲'button'。 – 2014-09-03 10:59:14

5

有很多的方法來添加ActionListener,給定JComponent(支持它的使用)。我在代碼片段中添加了一些評論,以幫助更好地解釋它們,並在評論中提供一些鏈接供將來參考。

1)如果該類實現的ActionListener接口,即,類本身包含actionPerformed(...)方法,那麼可以做到這一點,以這種方式:

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

public class Skeleton implements ActionListener { 

    private JFrame frame; 
    private JPanel contentPane; 
    private JButton button; 

    private void displayGUI() { 
     frame = new JFrame("Skeleton"); 
     /* 
     * EXIT_ON_CLOSE is same as putting System.exit(0), 
     * which in some sense, doesnot allows one's 
     * application to terminate graciously. 
     */ 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     button = new JButton("This is a button."); 
     /* 
     * This is one way of attaching an ActionListener 
     * to the JButton, but the main disadvantage of 
     * this approach is, it breaks encapsulation, 
     * as you can see the public method, actionPerformed(), 
     * is lying free to be accessed by any code outside 
     * the scope of the class 
     */ 
     button.addActionListener(this); 

     contentPane.add(button); 

     frame.setContentPane(contentPane);   
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true);         
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new Skeleton().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JOptionPane.showMessageDialog(frame, "BINGO!", 
      "Information: ", JOptionPane.INFORMATION_MESSAGE); 
    }  
} 

2.)如果一個沒有按不想創建不必要的class文件。然後此方法中,其使用,EventHandler可以使用:

import java.awt.*; 
import java.awt.event.*; 
import java.beans.EventHandler; 
import javax.swing.*; 

public class Example1 { 

    private JFrame frame; 
    private JPanel contentPane; 
    private JButton button; 

    private void displayGUI() { 
     frame = new JFrame("Skeleton"); 
     /* 
     * EXIT_ON_CLOSE is same as putting System.exit(0), 
     * which in some sense, doesnot allows one's 
     * application to terminate graciously. 
     */ 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     button = new JButton("This is a button."); 
     /* 
     * This is another way of attaching 
     * an ActionListener to the JButton, 
     * the main advantage of this approach 
     * is, that one does not have to create 
     * a new class to handle events 
     * More info regarding the use of this 
     * approach, can be found on this link : 
     * http://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html 
     */ 
     button.addActionListener((ActionListener) 
       EventHandler.create(ActionListener.class 
         , Example1.this, "buttonAction", "")); 

     contentPane.add(button); 

     frame.setContentPane(contentPane);   
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true);         
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new Example1().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 

    public void buttonAction(ActionEvent e) { 
     JOptionPane.showMessageDialog(frame, "BINGO!", 
      "Information: ", JOptionPane.INFORMATION_MESSAGE); 
    }  
} 

3.)如果一個是關於Encapsulation概念更加關注,則這種方法是有益的:

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

public class Example2 { 

    private JFrame frame; 
    private JPanel contentPane; 
    private JButton button; 

    private ActionListener buttonActions = 
          new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      JOptionPane.showMessageDialog(frame, "BINGO!", 
       "Information: ", JOptionPane.INFORMATION_MESSAGE); 
     } 
    }; 

    private void displayGUI() { 
     frame = new JFrame("Skeleton"); 
     /* 
     * EXIT_ON_CLOSE is same as putting System.exit(0), 
     * which in some sense, doesnot allows one's 
     * application to terminate graciously. 
     */ 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     button = new JButton("This is a button."); 
     /* 
     * This is another way of attaching 
     * an ActionListener to the JButton, 
     * the main advantage of this approach 
     * is, it adheres to encapsulation. 
     */ 
     button.addActionListener(buttonActions); 

     contentPane.add(button); 

     frame.setContentPane(contentPane);   
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true);         
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new Example2().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    }  
} 

4 )如果更傾向於創建匿名類,那麼可以使用此方法:

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

public class Example3 { 

    private JFrame frame; 
    private JPanel contentPane; 
    private JButton button; 

    private void displayGUI() { 
     frame = new JFrame("Skeleton"); 
     /* 
     * EXIT_ON_CLOSE is same as putting System.exit(0), 
     * which in some sense, doesnot allows one's 
     * application to terminate graciously. 
     */ 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     button = new JButton("This is a button."); 
     /* 
     * This is the fourth way of attaching 
     * an ActionListener to the JButton, 
     * the main advantage of this approach 
     * is, it adheres to encapsulation, the 
     * public method remains hidden 
     * inside the Anonymous Class 
     * More info can be found on this link : 
     * http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html 
     * The main disadvantage of this approach is 
     * that it doesnot gives you the privilege 
     * of separation of concerns, which can 
     * be done using the fifth approach, 
     * which is MVC - Pattern (Model-View-Controller) 
     * and moreover, it creates a hell lot of classes, in 
     * your project, which can lead to extra overhead 
     */ 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       JOptionPane.showMessageDialog(frame, "BINGO!", 
        "Information: ", JOptionPane.INFORMATION_MESSAGE); 
      } 
     }); 

     contentPane.add(button); 

     frame.setContentPane(contentPane);   
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true);         
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new Example3().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    }  
} 

編輯:

5。)該方法包括使用Action而不是ActionListener。這是要用於共享各種JComponent選自S相同的功能,從而導致代碼重用

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

public class Example4 { 

    private JFrame frame; 
    private JPanel contentPane; 
    private JMenuItem showMenuItem; 
    private JButton button; 

    private Action myActions; 

    /* 
    * This approach is basically used, when 
    * one wants to share the same functionality 
    * of different JComponents among each other, 
    * without writing redundant codes for each 
    * one of those components. Here JMenuItem 
    * and JButton are both using the same 
    * functionality, to perform the same task. 
    * More info can be found on this link: 
    * http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html 
    */ 
    private class MyActions extends AbstractAction { 
     public MyActions(String title, String desc) { 
      super(title); 
      putValue(SHORT_DESCRIPTION, desc); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      JOptionPane.showMessageDialog(frame, "BINGO!", 
        "Information: ", JOptionPane.INFORMATION_MESSAGE); 
     } 
    } 

    private void displayGUI() { 
     frame = new JFrame("Skeleton"); 
     /* 
     * EXIT_ON_CLOSE is same as putting System.exit(0), 
     * which in some sense, doesnot allows one's 
     * application to terminate graciously. 
     */ 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new JPanel(); 
     button = new JButton("This is a button."); 

     myActions = new MyActions("Show", "A small description"); 
     button.setAction(myActions); 

     contentPane.add(button); 

     frame.setJMenuBar(getJMenuBar()); 
     frame.setContentPane(contentPane);   
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true);         
    } 

    private JMenuBar getJMenuBar() { 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     showMenuItem = new JMenuItem(myActions); 
     fileMenu.add(showMenuItem); 

     menuBar.add(fileMenu); 

     return menuBar; 
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new Example4().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    }  
} 
+1

+1既然你走了這麼遠,也許你想添加'行動'混合;-) – 2014-09-02 16:35:54

+0

@splungebob [我很驚訝,這個舊戰爭 (你)在Java論壇不知道關於某事](http://stackoverflow.com/a/9007348/714968) – mKorbel 2014-09-02 18:38:17

1

顯然答案是地方this到您addActionListener方法。

addActionListener方法採用作爲參數的對象,實現ActionListener接口,這個接口強迫你實現/地方,在你的代碼的actionPerformed方法,它是被稱爲一個,當觸發動作到分配的組件。

因此,將this放置在您的方法中,它將在您傳遞的對象內部進行搜索,在我們的例子中爲Translator對象搜索actionPerformed方法並調用它。

this.french.addActionListener(this); 

當然,爲了工作,還有很多代碼丟失。

我真的很喜歡@Sandeep回答採用lambda表達式。 你可以在下面看到一個完整的例子。

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Translator extends JPanel implements ActionListener {  

    private JButton french = new JButton(); 
    private JButton german = new JButton(); 
    private JButton irish = new JButton(); 

    @SuppressWarnings("empty-statement") 
    public Translator(){ 
     french = new JButton("French"); 
     german = new JButton("German"); 
     irish = new JButton("Irish");   
//  setLayout(new GridLayout(2,1));   
     this.setLayout(new GridLayout(1,3)); 
     this.add(french); 
     this.add(german); 
     this.add(irish); 

     ActionListener ac = (ActionEvent ae) -> { System.out.println(((JButton) ae.getSource()).getText()); }; 
     this.french.addActionListener(ac); 
     this.german.addActionListener(ac); 
     this.irish.addActionListener(ac); 
     this.irish.addActionListener(Translator.this); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(((JButton) e.getSource()).getText()); 
    } 

    public static void main(String[] args) { 
     JFrame jframe = new JFrame("StackOverflow"); 
     jframe.add(new Translator()); 
     jframe.pack(); 
     jframe.setLocationRelativeTo(null); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setVisible(true); 
    } 
} 
相關問題