的Java Swing事件
我不知道应该如何实现事件当按下一个按钮,它会做一些动作,并停止做动作,当按钮被释放的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");
}
}
}
使用MouseEvent.getButton()的引用来获得触发事件的按钮。
getButton返回被点击的鼠标按钮 – Guy 2010-01-12 11:32:12
根据API:返回鼠标按钮中哪些(如果有的话)已经改变状态。 http://java.sun.com/javase/6/docs/api/java/awt/event/MouseEvent.html#getButton%28%29 – 2010-01-12 11:33:28
@Guy:我同意你的设想,OP希望得到'JButton'被按下而不是鼠标按钮,但是因为它并不是绝对清楚,所以在我看来,添加您的评论和**而不是**下调投票就足够了。 – 2010-01-12 11:39:33
您需要的invokeLater如下所述:Java: mytextarea.setText("hello") + Thread.sleep(1000) = strange result 否则你的行动将阻止用户界面线程
对于开始看SwingUtilities.invokeLater。
对于取消,我通常使用一个接口和一个取消操作,Runnable提供给invokeLater实现取消操作,取消按钮然后通过调用取消操作来取消取消操作。如何取消操作取决于它的作用,也许它可以设置一个取消标志,运行操作可以定期检查它是否应该继续。
请注意,您可以扩展侦听器实现类,如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
。
啊,所以有一个getSource。嗯,但行动却被调用一次。该方法是循环行动,直到释放鼠标按钮? – starcorn 2010-01-12 11:58:51