Как отключить событие щелчка мышью на ячейках JTable?
Я проверяю определенный столбец JTable. Мое требование состоит в том, что все ячейки этого столбца должны разрешать только алфавиты. Я добавил keylistener к объекту Jtable и написал некоторую логику следующим образом:
public void keyTyped ( KeyEvent e ) {
if(!(e.getKeyChar()>='a' &&e.getKeyChar()>='z')) {
getToolkit.beep();
}
}
Первоначально, когда фокус находится на ячейке и что-то вводится, ключевое событие срабатывает нормально, но когда я нажимаю на ту же ячейку и набираю, ключевое событие не срабатывает. Поэтому я решил отключить событие щелчка мышью на JTable. Как я могу отключить событие щелчка мыши на ячейках JTable?
3 ответа
Просто установите в этом столбце определенный редактор ячеек, который не позволит вводить неправильные символы. И чтобы быть уверенным, я бы также проверил вход в ваш TableModel
переопределив правильно setValueAt(Object, int, int)
:
Вот пример, который разрешает только символы от А до Я и от А до Я:
import java.awt.BorderLayout;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
public class TestTable {
private static final String ALPHA_ONLY_REGEXP = "\\p{Alpha}*";
private static final String NONALPHA_REGEXP = "[^\\p{Alpha}]+";
private int ALPHA_ONLY_COLUMN_INDEX = 2;
protected String validateAndFixString(String string) {
if (!string.matches(ALPHA_ONLY_REGEXP)) {
string = string.replaceAll(NONALPHA_REGEXP, "");
}
return string;
}
protected void initUI() {
final DefaultTableModel model = new DefaultTableModel() {
@Override
public void setValueAt(Object aValue, int row, int column) {
if (column == ALPHA_ONLY_COLUMN_INDEX) {
if (aValue != null) {
aValue = validateAndFixString((String) aValue);
}
}
super.setValueAt(aValue, row, column);
}
};
for (int i = 0; i < 5; i++) {
model.addColumn("Col-" + (i + 1));
}
for (int i = 0; i < 200; i++) {
Vector<Object> row = new Vector<Object>();
for (int j = 0; j < 5; j++) {
if (j == ALPHA_ONLY_COLUMN_INDEX) {
row.add("AlphabetOnly");
}
row.add("New cell - " + (j + 1));
}
model.addRow(row);
}
JTable table = new JTable(model);
JTextField alphaOnly = new JTextField();
((PlainDocument) alphaOnly.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
string = validateAndFixString(string);
super.insertString(fb, offset, string, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
text = validateAndFixString(text);
super.replace(fb, offset, length, text, attrs);
}
});
table.getColumnModel().getColumn(ALPHA_ONLY_COLUMN_INDEX).setCellEditor(new DefaultCellEditor(alphaOnly));
JFrame frame = new JFrame(TestTable.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollpane = new JScrollPane(table);
frame.add(scrollpane, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
Может быть, отключение событий мыши не очень хорошая идея. Как вы прямо не сказали, я не знаю, чего вы хотите достичь; Вы можете попробовать некоторые из следующих действий:
Отключить саму таблицу:
table.disable();
Сделать ячейки недоступными для редактирования (на модели таблицы):
public boolean isCellEditable (int row, int col) {
вернуть ложь;
}
И если вам нужно отключить события мыши, возможно, попробуйте добавить прослушиватель мыши, который вообще ничего не делает:
table.addMouseListener(java.awt.event.MouseAdapter
{
public void mouseClicked( java.awt.event.MouseEvent e)
{
// do nothing...
}
});
Надеюсь, это поможет.
Вам нужно добавить этот кейлист в ваш редактор.
после редактирования начните фокусироваться в этом редакторе, а не на своей jtable.