2013-12-11 2 views
0

Как принудительно остановить редактирование ячейки в JTable, когда пользователь нажимает на любой другой компонент, чем сама таблица?Force stop редактирование ячейки в 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

Свойство term termEditOnFocusLost должно работать. Опубликуйте свой «SSCCE», который демонстрирует проблему. – camickr

+0

'Он должен работать, нажимая на любой компонент.' - в кадре нет компонентов, которые получают фокус при нажатии на них. Что именно ты пытаешься сделать? Вы пытаетесь сохранить данные, когда пользователь нажимает кнопку «Закрыть»? Если это так, используйте WindowListener и обработчик windowClosing() и прекратите редактирование в таблице. – camickr

+0

На самом деле, я просто хочу, чтобы редактирование ячейки прекращалось, когда пользователь щелкает где-то за пределами таблицы. – user955732

ответ

0

таблица не занимает все пространство в окне просмотра в ScrollPane, так что вы на самом деле нажав на видовом экране. По умолчанию видовое окно не фокусируется, когда вы нажимаете на него, поэтому нет метода focusLost, сгенерированного в таблице.

Может быть, вы можете просто использовать следующий, так что таблица заполняет видовой экран:

table.setFillsViewportHeight(true); 

В противном случае, вам нужно будет добавить MouseListener к иллюминатору, чтобы обрабатывать события мыши. Вам нужно будет сделать это для всех компонентов на фрейме, которые не могут получить фокус, например JPanel.

Или, может быть, другой подход заключается в использовании AWTEventListener для прослушивания всех щелчков мыши. Обратный подход к этому подходу заключается в том, что вы не можете различать щелчок на фокусируемом компоненте и неаккумулируемом компоненте, чтобы вы пытались остановить редактирование ячейки каждый раз, когда клик сделан. См. Global Event Listeners для получения дополнительной информации.

Смежные вопросы