繁体   English   中英

如何在JTable的单元格上禁用鼠标单击事件?

[英]How to disable mouse click event on cells of JTable?

我正在验证JTable的特定列。 我的要求是该列的所有单元格应只允许字母。我向Jtable的对象添加了keylistener并编写了一些逻辑,如下所示:

public void keyTyped ( KeyEvent e ) {

    if(!(e.getKeyChar()>='a' &&e.getKeyChar()>='z')) {
        getToolkit.beep();
    } 
}

最初,当焦点放在单元格上并键入内容时,会触发键事件,但是当我单击相同的单元格并键入时,键事件不会被触发。 因此,我决定在JTable上禁用鼠标单击事件。 如何禁用JTable单元上的鼠标单击事件?

只需在该列上设置特定的单元格编辑器,该编辑器将不允许输入错误的字符。 并且可以肯定的是,我还将通过适当地重写setValueAt(Object, int, int)验证TableModel的输入:

这是一个仅允许从A到Z和从a到z的字符的示例:

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();
            }
        });
    }

}

也许禁用鼠标事件不是一个好主意。 正如您没有明确说的那样,我不知道您想要实现什么; 您可以尝试以下一些方法:

  1. 禁用表本身: table.disable();

  2. 使单元格不可编辑(在表格模型上):

    公共布尔isCellEditable(int row,int col){
    返回false;
    }

而且,如果必须禁用鼠标事件,则可以尝试添加一个根本不执行任何操作的鼠标侦听器:

table.addMouseListener(java.awt.event.MouseAdapter  
  {  
    public void mouseClicked( java.awt.event.MouseEvent e)  
    {  
      // do nothing...  
    }  
  });

希望能有所帮助。

您需要将该键侦听器添加到编辑器中。

一旦编辑,就开始在该编辑器中将焦点移到您的jtable上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM