2010-01-12 2 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

Метод getSource из MouseEvent унаследовал от EventObject должно дать вам ссылку на щелкнули кнопку java api link

+0

ах, так что был getSource. hmm но действие, однако, вызывается один раз. Будет ли подход циклическим действием до тех пор, пока не будет отпущена кнопка мыши? – starcorn

0

Использование MouseEvent.getButton(), чтобы получить кнопку, запускаемая событием.

+0

getButton возвращает кнопку мыши, на которую была нажата кнопка – Guy

+0

В соответствии с API: возвращает, какие кнопки кнопок мыши изменились. http://java.sun.com/javase/6/docs/api/java/awt/event/MouseEvent.html#getButton%28%29 –

+0

@Guy: Я согласен с вашим предположением, что OP хочет получить «JButton», который был нажат вместо кнопки мыши, но, поскольку это не совсем ясно, добавление вашего комментария и ** не ** downvoting было бы достаточно, на мой взгляд. –

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.

Смежные вопросы