2010-01-12 59 views
1

我不知道应该如何实现事件当按下一个按钮,它会做一些动作,并停止做动作,当按钮被释放的Java Swing事件

我试图添加MouseListerner这种方法。问题是它会认识到我按下了按钮。但不是它是哪个按钮。所以想知道它应该怎样写,这样才能知道我按下了哪个按钮。

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 


public class Main extends JFrame implements MouseListener, ActionListener{ 

    private JPanel panel1 = new JPanel(); 
    private JPanel panel2 = new JPanel(new GridLayout(4,4)); 



    public Main() { 
     setSize(300,400); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     setLayout(new BorderLayout()); 
     add(panel1, BorderLayout.NORTH); 
     add(panel2, BorderLayout.CENTER); 

     String[] buttonNamn = {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 

     for(int i=0;i<buttonNamn.length;i++) { 
      JButton button = new JButton(buttonNamn[i]); 
      panel2.add(button); 
      button.addMouseListener(this); 
      button.addActionListener(this); 
     } 

    } 
    public static void createGUI() { 
     new Main(); 
    } 

    public static void main(String[] args) { 

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

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

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

    } 
    @Override 
    public void mousePressed(MouseEvent arg0) { 
     System.out.println("Pressed"); 

    } 
    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     System.out.println("Relased"); 


    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getActionCommand().equals("1")) { 
      System.out.println("Foo 1"); 
     } 
     else if(e.getActionCommand().equals("2")){ 
      System.out.println("Foo 2"); 
     } 
    } 
} 

回答

0

的MouseEvent的方法的getSource从继承的EventObject应该给你点击的按钮 java api link

+0

啊,所以有一个getSource。嗯,但行动却被调用一次。该方法是循环行动,直到释放鼠标按钮? – starcorn 2010-01-12 11:58:51

0

使用MouseEvent.getButton()的引用来获得触发事件的按钮。

+0

getButton返回被点击的鼠标按钮 – Guy 2010-01-12 11:32:12

+0

根据API:返回鼠标按钮中哪些(如果有的话)已经改变状态。 http://java.sun.com/javase/6/docs/api/java/awt/event/MouseEvent.html#getButton%28%29 – 2010-01-12 11:33:28

+0

@Guy:我同意你的设想,OP希望得到'JButton'被按下而不是鼠标按钮,但是因为它并不是绝对清楚,所以在我看来,添加您的评论和**而不是**下调投票就足够了。 – 2010-01-12 11:39:33

1

对于开始看SwingUtilities.invokeLater。

对于取消,我通常使用一个接口和一个取消操作,Runnable提供给invokeLater实现取消操作,取消按钮然后通过调用取消操作来取消取消操作。如何取消操作取决于它的作用,也许它可以设置一个取消标志,运行操作可以定期检查它是否应该继续。

1

请注意,您可以扩展侦听器实现类,如MouseAdapter以保存一些输入(仅覆盖要使用的方法)。

不是使用单个侦听器,而是使用一堆case语句来试图找出按钮和数据之间的关系,为每个按钮添加一个新的侦听器并将数据保存在侦听器中。这段代码通过anonymous class来做到这一点。

public static void main(String[] args) { 
    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(4, 4)); 
    String[] buttonName = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", 
     "B", "C", "D", "E", "F" }; 
    for (final String name : buttonName) { 
     JButton button = new JButton(name); 
     panel.add(button); 
     button.addMouseListener(new MouseAdapter() { 
     @Override public void mousePressed(MouseEvent e) { 
      System.out.println("pressed:" + name); 
     } 

     @Override public void mouseReleased(MouseEvent e) { 
      System.out.println("released:" + name); 
     } 
     }); 
    } 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(panel); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

请注意使用final关键字。

如果您愿意,还有其他表达方式。这种方法增加了一个静态内部类:

private static class MyListener extends MouseAdapter { 
    private final String name; 

    public MyListener(String name) { 
     this.name = name; 
    } 

    @Override public void mousePressed(MouseEvent e) { 
     System.out.println("pressed:" + name); 
    } 

    @Override public void mouseReleased(MouseEvent e) { 
     System.out.println("released:" + name); 
    } 
    } 

    public void addStaticInnerClassListener(JButton button, String name) { 
    button.addMouseListener(new MyListener(name)); 
    } 

这一个使用范围限定为方法的类:

public void addNameListener(JButton button, final String name) { 
    class MyListener extends MouseAdapter { 
     @Override public void mousePressed(MouseEvent e) { 
     System.out.println("pressed:" + name); 
     } 

     @Override public void mouseReleased(MouseEvent e) { 
     System.out.println("released:" + name); 
     } 
    } 
    button.addMouseListener(new MyListener()); 
    } 

你要执行的代码/动作必须在另一个线程来执行。 Swing为此提供了一些实用程序类,例如SwingWorker