gpt4 book ai didi

java - 来自 JTextField 的鼠标事件不会传播

转载 作者:行者123 更新时间:2023-11-30 04:50:27 25 4
gpt4 key购买 nike

我正在尝试监听来自 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 时,它不会显示。为什么会这样?

谢谢!

最佳答案

我认为这是一个有趣的问题,有点意外地踩踏了这一发现。我将使用下面的代码片段进行解释。

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 中,我想这就是为什么当您单击 文本时,它不会触发 mousePressed 事件,而只会触发 JTextField 事件。

下面是我的完整代码。如果您希望文本字段知道鼠标按下,请考虑在 FieldPanel 类中实现 MouseAdapter() 并添加 addMouseListener(this) 文本标签

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();
}
});

}


}

关于java - 来自 JTextField 的鼠标事件不会传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com