События мыши из JTextField не распространяются - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь прослушивать события мыши, поступающие как из JLabel, так и из JTextField. Однако я могу слушать только события мыши из JLabel, но не из JTextField.

Рассмотрим этот код:

class FieldPanel extends JPanel{
  JLabel label;
  JTextField text;

  public FieldPanel(){
    label = new JLabel("This is a test label");
    text = new JTextField("This is a test field");
    add(label);
    add(text);
  } 
}

class OuterPanel extends JPanel{
  FieldPanel fieldPanel;

  public OuterPanel(){
    fieldPanel = new FieldPanel();
    fieldPanel.addMouseListener(new MouseAdapter(){
        @Override
        public void mousePressed(MouseEvent event) {
            System.out.println("Mouse pressed !!");
        }
    });
    add(fieldPanel);
  }
}

public class UITest{
    public static void main (String args[]){
        JFrame frame = new JFrame();
        OuterPanel outerPanel = new OuterPanel();
        frame.getContentPane().add(outerPanel);
        frame.pack();
        frame.setVisible(true);
    }
}

Мышь нажата !! сообщение отображается, когда я нажимаю на JLabel. Тем не менее, он не отображается, когда я нажимаю на JTextField. Почему это так?

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Спасибо за все ответы.

Я нашел какой-то обходной путь. Я изменяю свой код так, чтобы я слушал непосредственно компонент JTextField, а не слушал панель.

1 голос
/ 02 апреля 2012

Я думаю, что это интересный вопрос, который как бы случайно топает при нахождении.Я объясню, используя приведенный ниже фрагмент кода.

class FieldPanel extends JPanel
{
    //JLabel label;
    JTextField text;

    public FieldPanel()
    {
        //label = new JLabel("This is a test label");
        text = new JTextField("This is a test field");
        //add(label);
        add(text);          
    }
}

Когда вы запустите код с изменениями, приведенными выше, что мы ожидаем, что вывод только текстовое поле правильно?Затем, если вы нажмете на область рядом с для текстового поля за пределами области, проверьте вывод вашей консоли, он фактически выведет Нажатие мыши !!

Итак, я углубился в изучение JTextField, оно на самом деле состоит из JTextField и JTextComponent.Когда вы вызываете конструктор new JTextField("This is a test field");, текст на самом деле устанавливается в JTextComponent, а не в JTextField, и я думаю, поэтому, когда вы нажимаете text , он не вызывает событие mousePressed, а вызываеттолько JTextField.

Ниже приведен мой полный код.Если вы хотите, чтобы текстовое поле знало о нажатой мыши, рассмотрите реализации MouseAdapter() в вашем классе FieldPanel и добавьте addMouseListener(this) для text и label.

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


public class MyMouseEvent extends JPanel
{

    public MyMouseEvent()
    {
        FieldPanel fieldPanel;
        fieldPanel = new FieldPanel();
        fieldPanel.addMouseListener(new MouseAdapter() {
               @Override
                public void mousePressed(MouseEvent event)
               {
                    System.out.println("Mouse pressed !!");
                }
        });
        add(fieldPanel);

    }

    class FieldPanel extends JPanel
    {
        //JLabel label;
        JTextField text;

        public FieldPanel()
        {
            //label = new JLabel("This is a test label");
            text = new JTextField("This is a test field");
            //add(label);
            add(text);          
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyMouseEvent evt = new MyMouseEvent();
        evt.setOpaque(true);
        frame.setContentPane(evt);

        frame.pack();
        frame.setVisible(true);     
    }

    public static void main (String args[])
    {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() 
            {
                createAndShowGUI();             
            }
        });

    }


}
...