单击鼠标强制停止在JTable中编辑单元格

时间:2013-12-11 18:45:36

标签: swing jtable mouseevent

当用户点击表本身以外的任何其他组件时,如何强制停止编辑JTable中的单元格?

试过这个,但它不起作用......

myTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

...或者这个,它也没有按预期工作

Component co = myTable.getEditorComponent(); 
if (co != null && !(co instanceof JComboBox)) { 
    co.addFocusListener(new java.awt.event.FocusAdapter() { 
        public void focusLost(java.awt.event.FocusEvent evt) { 
            TableCellEditor tce = myTable.getCellEditor(); 
            if (tce != null) { 
                tce.stopCellEditing(); // should accept partial edit 
            } 
        } 
    }); 
}

有一个带有动作监听器的按钮可以强制停止编辑表格中的任何单元格,但这并不是我正在寻找的解决方案。 它应该通过点击任何组件来工作。

SSCCE

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class TableExample {
  public static void main(String args[]) {

    final Object rowData[][] = { { "1", "one", "not empty" }, { "2", "two", "" }, { "3", "three", "" } };
    final String columnNames[] = { "#", "Some Column", "Some Other Column" };

    final JTable table = new JTable(rowData, columnNames);
    JScrollPane scrollPane = new JScrollPane(table);

    table.getModel().addTableModelListener(new TableModelListener() {

      public void tableChanged(TableModelEvent e) {
         System.out.println("column: "+e.getColumn());
         if(1==e.getColumn()){
             System.out.println(table.getModel().getValueAt(e.getLastRow(), e.getColumn()));
             String value = table.getModel().getValueAt(e.getLastRow(), e.getColumn()).toString();
             int rowIndex = e.getLastRow();

             if(table.getModel().getValueAt(e.getLastRow(), 2).toString().isEmpty())
                 table.getModel().setValueAt(value,e.getLastRow(), 2);
         }
      }
    });

    table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
    table.setValueAt("",0,0);
    JFrame frame = new JFrame("Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.add(scrollPane, BorderLayout.CENTER);

    frame.setSize(700, 150);
    frame.setVisible(true);

  }
}

1 个答案:

答案 0 :(得分:0)

该表不会占用滚动窗格视口中的所有空间,因此您实际上是在单击视口。默认情况下,单击视口时,视口不会获得焦点,因此表上没有生成focusLost方法。

也许您可以使用以下内容,以便表格填充视口:

table.setFillsViewportHeight(true);

否则,您需要将一个MouseListener添加到视口以处理鼠标单击事件。您需要对无法获得焦点的帧上的所有组件执行此操作,例如JPanel。

或者,也许另一种方法是使用AWTEventListener来监听所有鼠标点击。回退到这种方法是你无法区分可聚焦组件和不可聚焦组件的点击,因此每次点击时都会尝试停止单元格编辑。有关详细信息,请参阅Global Event Listeners