【问题标题】:How to make JTable with JComboBox respond only on double click instead of single click如何使用 JComboBox 使 JTable 仅在双击而不是单击时响应
【发布时间】:2018-01-28 12:01:54
【问题描述】:

所以这是我第一次尝试使用CellEditors 为我的JTable 嵌入JComboBoxJSpinner。一切正常,我可以看到JComboBox 模型中的值以及JSpinner 的模型值。

但是,我注意到,只要我单击具有 JComboBox 的 JTable 列,它就会始终显示 JComboBox 的值。

它对用户不是很友好,因为我认为用户更愿意双击JTable 的列来获取下拉框值并从中选择值而不是单击

如何将JComboBox 的行为更改为仅在双击 时显示自己?

我想我应该将MouseListener 应用到JComboBox,但我不知道下一步该做什么。

这是我到目前为止所写的。

public class ScheduleDayCellEditor extends DefaultCellEditor{
    private JComboBox jcmbDays;
    private JTable jtblSchedule;
    private DefaultComboBoxModel model;

    public ScheduleDayCellEditor(){
        super(new JComboBox());
        model = new DefaultComboBoxModel(new String[]{"Mon","Tue","Wed","Thu","Fri"});
        jcmbDays = new JComboBox(model);
        jcmbDays.setEditable(false);
        jcmbDays.setSelectedIndex(-1);

        jcmbDays.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getClickCount() == 2){
                    //? ? ? ?
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return jcmbDays;
    }

    @Override
    public Object getCellEditorValue() {
        return jcmbDays.getSelectedItem(); //To change body of generated methods, choose Tools | Templates.
    }

这是附加说明的屏幕截图。

如果有任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

    标签: java swing jtable tablecelleditor


    【解决方案1】:

    如果您需要出于其他原因扩展DefaultCellEditor,您可以简单地使用count2 调用其setClickCountToStart() 方法。

    DefaultCellEditor editor = new DefaultCellEditor(jcmbDays);
    editor.setClickCountToStart(2);
    jcmbColumn.setCellEditor(editor);
    

    【讨论】:

      【解决方案2】:

      通过应用进一步的标准来简单地覆盖 isCellEditable:

      @Override
      public boolean isCellEditable(EventObject aAnEvent) {
          boolean cellEditable = super.isCellEditable(aAnEvent);
      
          if (cellEditable && aAnEvent instanceof MouseEvent) {
              cellEditable = ((MouseEvent) aAnEvent).getClickCount() == 2;
          }
      
          return cellEditable;
      }
      

      【讨论】:

      • 感谢您的回答。我不知道我可以从 DefaultCellEditor 扩展类中覆盖它。解决了。​​
      猜你喜欢
      • 2022-01-13
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多