Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events JComboBox焦点和鼠标单击事件不起作用_Events_Swing_Jcombobox - Fatal编程技术网

Events JComboBox焦点和鼠标单击事件不起作用

Events JComboBox焦点和鼠标单击事件不起作用,events,swing,jcombobox,Events,Swing,Jcombobox,编辑 唐纳,这个问题怎么不好?我提供了该问题的可运行示例代码。如果它对你有效,请让我知道或指出什么是不清楚的 你好, 在下面的代码中,在JFrame中有一个JComboBox,当鼠标进入JComboBox或被单击或获得焦点时,我没有收到通知。但是,弹出菜单事件工作正常 我做错了什么?(我的目标是在单击JComboBox的文本组件时发出警报) 公共类testjcombox扩展了javax.swing.JFrame { 公共测试jcombox() { 初始化组件(); } // 私有组件(){ j

编辑
唐纳,这个问题怎么不好?我提供了该问题的可运行示例代码。如果它对你有效,请让我知道或指出什么是不清楚的

你好,
在下面的代码中,在
JFrame
中有一个
JComboBox
,当鼠标进入
JComboBox
或被单击或获得焦点时,我没有收到通知。但是,
弹出菜单事件
工作正常

我做错了什么?(我的目标是在单击JComboBox的文本组件时发出警报)

公共类testjcombox扩展了javax.swing.JFrame
{
公共测试jcombox()
{
初始化组件();
}
// 
私有组件(){
jcombox1=newjavax.swing.JComboBox();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addMouseListener(新java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
formMouseClicked(evt);
}
});
jcombox1.setEditable(true);
setModel(新的javax.swing.DefaultComboxModel(新字符串[]{“Item 1”、“Item 2”、“Item 3”、“Item 4”});
jComboBox1.setName(“jComboBox1”);//NOI18N
jcombox1.addMouseListener(新java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
JCombox1MooseClicked(evt);
}
public void mouseenterned(java.awt.event.MouseEvent evt){
JCombox1MooseEntered(evt);
}
});
jcombox1.addPopupMenuListener(新的javax.swing.event.PopupMenuListener(){
public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt){
}
public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt){
}
public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt){
JCombox1PopupMenus将变得可见(evt);
}
});
jcombox1.addFocusListener(新java.awt.event.FocusAdapter(){
public void focusgoven(java.awt.event.FocusEvent evt){
JCombox1focusged(evt);
}
});
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(70,70,70)
.addComponent(jcombox1,javax.swing.GroupLayout.PREFERRED_SIZE,226,javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(104,简称最大值))
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(90,90,90)
.addComponent(jcombox1,javax.swing.GroupLayout.PREFERRED_SIZE,46,javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(164,简称最大值))
);
包装();
}// 
私有无效JCombox1FocusGuided(java.awt.event.FocusEvent evt)
{
System.out.println(“获得JComboBox焦点”);
}
私有void formMouseClicked(java.awt.event.MouseEvent evt)
{
System.out.println(“点击表单”);
jCombox1.setFocusable(假);
jCombox1.setFocusable(真);
}
私有void JCombox1MouseClicked(java.awt.event.MouseEvent evt)
{
System.out.println(“JComboBox单击”);
}
私有void JCombox1popupMenu将变得可见(javax.swing.event.PopupMenuEvent evt)
{
System.out.println(“JComboBox可见菜单”);
}
私有void jcombox1mouseintered(java.awt.event.MouseEvent evt)
{
System.out.println(“输入JComboBox”);
}
公共静态void main(字符串参数[])
{
invokeLater(new Runnable())
{
公开募捐
{
新建TestJComboBox().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JComboBox jcombox1;
//变量结束声明
}

谢谢

可能是选民对您使用Netbeans GUI编辑器感到不满。我自己也不喜欢它,但是如果您发现可以用它维护一个复杂的gui,欢迎您使用它。我个人讨厌它,因为各种非常讨厌的bug只在你试图编辑表单时才会出现,它会悄悄地丢失你的布局和组件设置。但这不是重点

无论如何,您需要像这样添加ActionListener:

jComboBox1.getEditor().getEditorComponent().addMouseListener(...);

JComboBox实际上是一个复合组件,其中包含JTextField、JButton和JList,因此您将ActionListener添加到包装组件中,而鼠标事件实际上将进入内部JTextField。

不要忘记comboBox实际上是一个容器。因此,如果您真的想拥有所有鼠标事件,您应该将侦听器添加到它包含的所有组件中

public void addMouseListener(final MouseListener mouseListener) { this.comboBox.addMouseListener(mouseListener); final Component[] components = this.comboBox.getComponents(); for(final Component component : components) { component.addMouseListener(mouseListener); } this.comboBox.getEditor().getEditorComponent().addMouseListener(mouseListener); } 公共无效添加MouseStener(最终MouseStener MouseStener){ this.comboBox.addMouseStener(mouseStener); 最终组件[]组件=this.comboBox.getComponents(); 用于(最终组件:组件){ 组件。添加MouseStener(MouseStener); } this.comboBox.getEditor().getEditorComponent().addMouseStener(mouseStener); } 有关更多详细信息,请访问。

“我的目标是在单击JComboBox的文本组件时收到警报”

这可以通过将FocusListener添加到JComboBox的底层JTextField组件来实现,该组件将按预期响应ComboBox的焦点获得和丢失

Component component = comboBox.getEditor().getEditorComponent();  
if (component instanceof JTextField){
 JTextField txtFiled = (JTextField) borderless;
 txtFiled.addFocusListener(new FocusListener() 
 {
   public void focusGained(FocusEvent e) 
   {
     //To Do Focus Gained
   }
   public void focusLost(FocusEvent e) 
   {
     //To Do Focus Lost
   }
 });
}
W
Component component = comboBox.getEditor().getEditorComponent();  
if (component instanceof JTextField){
 JTextField txtFiled = (JTextField) borderless;
 txtFiled.addFocusListener(new FocusListener() 
 {
   public void focusGained(FocusEvent e) 
   {
     //To Do Focus Gained
   }
   public void focusLost(FocusEvent e) 
   {
     //To Do Focus Lost
   }
 });
}