Я думаю, что это интересный вопрос, который как бы случайно топает при нахождении.Я объясню, используя приведенный ниже фрагмент кода.
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();
}
});
}
}