JButton с обоими ActionListener/MouseListener

Можно ли создать Jbutton с помощью ActionListener и MouseListener

Это означает, что я создаю кнопку, а затем, когда я нажимаю ее (через actionListener), она меняет кадр, так что ПОСЛЕ нажатия кнопки я могу нажать в любом месте кадра, и MouseListener будет использоваться.

JButton button = new JButton();//Creates Button
button.addActionListener(new ActionListener() {         
public void actionPerformed(ActionEvent e) {
    //Insert MouseListener
    //Then do something with mouseListener
}
}); 

Вот текущий код: однако теперь они синхронизируются, когда я пытаюсь нажать кнопку, и я не могу вызвать mouseListener во второй раз

    JButton button2 = new JButton("Click");
    button2.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("You clicked the button");
            newCube.stopCube();
        }

    });
    button2.addMouseListener(new java.awt.event.MouseAdapter()
    {
        public void mousePressed(java.awt.event.MouseEvent evt)
        {
            double x = evt.getX();
            double y = evt.getY();
            newCube.setCube(x,y);
        }
    });

person user3249265    schedule 12.03.2014    source источник
comment
Да, можно, но с какой целью?   -  person alex2410    schedule 12.03.2014
comment
как бы я это сделал? цель состоит в том, что предположим, что у меня есть рамка с двумя кнопками, одна из которых что-то перемещает, а вторая останавливает, а затем, используя прослушиватель мыши, я могу перемещать ее вручную.   -  person user3249265    schedule 12.03.2014


Ответы (4)


Если вы хотите переместить что-то, щелкнув по нему, вы можете использовать прослушиватель мыши непосредственно на этом узле, а не на кнопке.

Чтобы добавить прослушиватель действий и прослушиватель мыши на кнопку, вы можете использовать методы addActionListener и addMouseListener на кнопке.

Посмотрите API для получения информации об этих методах... http://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html

person user2997477    schedule 12.03.2014
comment
пытался добавить оба, но mouseListener всегда будет работать синхронно с actionListener - person user3249265; 12.03.2014
comment
Вы можете использовать логическую переменную для переключения между прослушивателем мыши. - person user2997477; 12.03.2014

Если я вас правильно понял, этот образец может вам помочь (добавьте его в свой собственный ActionListener)

@Override
public void actionPerformed(ActionEvent e) {
    ((JButton)e.getSource()).addMouseListener(yourMouseListener);
}

Я пробовал это, это работает.

person rzysia    schedule 12.03.2014
comment
что такое ваш MouseListener? публичный недействительный метод? - person user3249265; 12.03.2014
comment
это может быть все, что реализует интерфейс MouseListener (особенно new MouseListener(){ //тело MouseListener с переопределенными методами } - person rzysia; 12.03.2014

Вот пример с JToggleButton, который добавляет/удаляет MouseListener в JFrame.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JToggleButton;

public class Example extends JFrame {

    private MouseAdapter mouseListener;

    public Example(){
        init();
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void init() {
        mouseListener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                System.out.println("clicked");
            }
        };
        setLayout(new FlowLayout());
        JToggleButton b = new JToggleButton("add listener");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(((JToggleButton)e.getSource()).isSelected()){
                    Example.this.addMouseListener(mouseListener);
                    ((JToggleButton)e.getSource()).setText("remove listener");
                } else {
                    Example.this.removeMouseListener(mouseListener);
                    ((JToggleButton)e.getSource()).setText("add listener");
                }
            }
        });
        add(b);
    }

    public static void main(String... s){
        new Example();
    }
}

РЕДАКТИРОВАТЬ: пример с JButton:

public class Example extends JFrame {

    private MouseAdapter mouseListener;

    public Example(){
        init();
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void init() {
        mouseListener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                System.out.println("clicked");
            }
        };
        setLayout(new FlowLayout());
        JButton b = new JButton("add listener");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(((JButton)e.getSource()).getText().equals("add listener")){
                    Example.this.addMouseListener(mouseListener);
                    ((JButton)e.getSource()).setText("remove listener");
                } else {
                    Example.this.removeMouseListener(mouseListener);
                    ((JButton)e.getSource()).setText("add listener");
                }
            }
        });
        add(b);
    }

    public static void main(String... s){
        new Example();
    }
}
person alex2410    schedule 12.03.2014
comment
извините, я не знаком с JToggle, поэтому я немного запутался, есть ли более простой способ без него? - person user3249265; 12.03.2014
comment
Да, вы можете использовать JButton, но JToggleButton указывает, что ваш MouseListener активен. - person alex2410; 12.03.2014

Что вы хотите сделать, мне до сих пор не ясно. Хотя это может вам помочь. Он добавит список мыши к компоненту при нажатии кнопки «Пуск» и удалит список мыши при нажатии кнопки «Стоп». Таким образом, вы можете остановить синхронную работу двух слушателей.

JButton startButton = new JButton();

startButton.addActionListener(new ActionListener() {         
public void actionPerformed(ActionEvent e) {

   //Add MouseListener to move the component

}
}); 

JButton stopButton = new JButton();

stopButton.addActionListener(new ActionListener() {         
public void actionPerformed(ActionEvent e) {

   //Remove the MouseListener

}
}); 
person user2997477    schedule 12.03.2014