Java Swing событие - PullRequest
       20

Java Swing событие

1 голос
/ 12 января 2010

Интересно, как реализовать событие, которое будет выполнять какое-то действие при нажатии кнопки, и прекратить это действие, когда кнопка отпущена

Я попытался добавить 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");
        }
    }
}

Ответы [ 5 ]

1 голос
/ 12 января 2010

Обратите внимание, что вы можете расширить классы реализации слушателя, такие как MouseAdapter, чтобы сэкономить немного времени при наборе (только те методы, которые вы хотите использовать).

Вместо того, чтобы использовать одного слушателя и иметь кучу операторов case, чтобы попытаться выяснить связь между кнопкой и данными, добавьте нового слушателя к каждой кнопке и удерживайте данные в слушателе. Этот код делает это с анонимным классом .

  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.

1 голос
/ 12 января 2010

Для начала посмотрите на SwingUtilities.invokeLater.

Для отмены я обычно использую интерфейс с операцией отмены, которую реализует Runnable, предоставленный invokeLater, затем кнопка отмены запускает отмену, просто вызывая операцию отмены. То, как это отменяет операцию, зависит от того, что она делает, может быть, она установит отмененный флаг, который текущая операция может периодически проверять, чтобы увидеть, следует ли продолжать.

1 голос
/ 12 января 2010

Вам потребуется invokeLater, как описано здесь: Java: mytextarea.setText ("hello") + Thread.sleep (1000) = странный результат в противном случае ваше действие заблокирует поток пользовательского интерфейса

0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

Метод getSource MouseEvent, унаследованный от EventObject, должен дать вам ссылку на нажатую кнопку Java API-ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...