我怎么知道,如果一个项目的自动完成饰JComboBox可鼠标单击?(How do I know if

2019-07-03 11:02发布

我使用的是SwingX AutoCompleteDecoratorJComboBox 。 自动完成功能,精美的作品...

但我有麻烦,以确定最终用户选择的时刻 ; 要坚持很少我的数据。

让我试着解释:组合框触发一个“comboBoxChanged” - ActionEvent的每一个选择。 我有当用户键入字符忽略这些事件和组合框是自动匹配和选择项目。 如果用户点击回车键的“comboBoxEdited” - ActionEvent产生,我可以保存选择的值。 大;-)

如果鼠标用于打开JComboBox -PopUp和选择一个项目,唯一的触发的事件是一种“comboBoxChanged” - ActionEvent (就像当自动匹配或选择与该光标键的项)。 在鼠标点击的事件以某种方式消耗掉!? 这就是为什么我不能确定最终鼠标选择。

我怎么可以算出来? 我失败的尝试监听的mouseClicked-事件都记录在这个SSCCE:

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;


public class SearchForThePopUpMouseClick extends JPanel
{
  private JComboBox<String> comboBox;

  public SearchForThePopUpMouseClick()
  {
    comboBox = new JComboBox<String>(new String[] { "Anna", "Marc", "Maria", "Marten", "Peter" });
    add(comboBox);
    add(new JTextField("textfield to click"));

    AutoCompleteDecorator.decorate(comboBox);


    comboBox.addActionListener(new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Action Event with '" + e.getActionCommand() + " " + e.getID() + "'");
      };
    });


    ((Component) comboBox.getUI().getAccessibleChild(comboBox, 0)).addMouseListener(new MouseListener()
    {
      @Override
      public void mouseReleased(MouseEvent e)
      {
        System.out.println(e);
      }
      @Override
      public void mousePressed(MouseEvent e)
      {
        System.out.println(e);
      } 
      @Override
      public void mouseExited(MouseEvent e)
      {
        System.out.println(e);
      }
      @Override
      public void mouseEntered(MouseEvent e)
      {
        System.out.println(e);
      }
      @Override
      public void mouseClicked(MouseEvent e)
      {
        System.out.println(e);
      }
    });
  }


  public static void main(String[] args) throws Exception
  {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        SearchForThePopUpMouseClick autoCompletePanel = new SearchForThePopUpMouseClick();
        JFrame frame = new JFrame("SwingX Autocomplete Example");
        frame.add(autoCompletePanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
    });
  }

}

Answer 1:

组合框没有最终选择的概念:所有的选择都有同等重量的语义独立于它们的触发(鼠标,键盘导航,编程,通过在核心的第一个字母的选择),并触发一个动作事件。 同样的行为平原和装饰组合框。

这正是你需要在大多数情况下是什么:反应选择总是好像它是最后 (不管这可能意味着)

如果你的情况,你真的想要把通过的MouseEvent的比那些什么都触发了最终引发了选择(再次:这是一般建议一个良好的用户体验,所以是非常,在你的评价非常小心),你可以检查由动作事件返回的修饰符:

if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
    // triggered by mouse
}

编辑

在评论中看到的用例(感谢他们提供!),意识到我提防表错部分咆哮:-)

在此背景下,鼠标器与键盘的姿势确实有不同的语义

  • 键盘:在编辑器中键入以及在弹出的浏览表示工艺打造的最终选择,有一个特殊的键(Enter)表示提交
  • 鼠标:单击,在弹出的既是选择和承诺

JComboBox中不支持使用情况最佳,发射太多。 在使用组合框作为CellEditor中时的问题甚至摆在内部,网络连接。 这部分是固定由一个神奇clientProperty:

public DefaultCellEditor(final JComboBox comboBox) {
    editorComponent = comboBox;
    comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

检测特性,BasicComboBoxUI(实际上是BasicComboPopup)按键导航仅在弹出的列表中选择,defering的listSelection的同步到comboSelection直到通过输入承诺。 这是因为部分先行(又名:打字,按首字母选择)还是选择(并因此犯)立即在组合。

简短的摘要:已经有一个摆动内部使用情况,从而导致已经可用的swingx内部的自动完成编辑在表中的解决方案 - 一个名为ComboBoxCellEditor类。 可单机使用也:

AutoCompleteDecorator.decorate( withEditor );
ComboBoxCellEditor editor = new ComboBoxCellEditor(withEditor);
CellEditorListener listener = new CellEditorListener() {

    @Override
    public void editingStopped(ChangeEvent e) {
        // do commit stuff
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
};
editor.addCellEditorListener(listener);
contentPane.add(withEditor, BorderLayout.SOUTH);


文章来源: How do I know if an item of an auto-complete decorated JComboBox is mouse clicked?