如何使Jtable禁止重复

时间:2011-05-19 18:05:55

标签: java jtable

我有一个Jtable允许编辑和插入。

当编辑列时,让我们说“ID”,我想要检查,如果插入的记录或编辑后的记录与其他记录有重复的“ID”列值。这是不允许的。

实际上,具体来说,如果某人正在编辑ID列,当他点击“Enter”或将焦点移动到另一个单元格时,执行检查,如果ID重复,则禁止该版本。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

扩展DefaultTableModel并覆盖检查重复的添加和更新方法,并将此类用于JTable

答案 1 :(得分:1)

  

如果有人正在编辑ID列,当他点击“Enter”或将焦点移动到另一个单元格时,执行检查,如果ID重复,则禁止该版本。

创建自定义编辑器以在将ID保存到模型之前验证该ID。这是一个简单的例子来启动你的目标:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableEdit extends JFrame
{
    TableEdit()
    {
        JTable table = new JTable(5,5);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollpane = new JScrollPane(table);
        getContentPane().add(scrollpane);

        //  Use a custom editor

        TableCellEditor fce = new FiveCharacterEditor();
        table.setDefaultEditor(Object.class, fce);
    }

    class FiveCharacterEditor extends DefaultCellEditor
    {
        FiveCharacterEditor()
        {
            super( new JTextField() );
        }

        public boolean stopCellEditing()
        {
            try
            {
                String editingValue = (String)getCellEditorValue();

                if(editingValue.length() != 5)
                {
                    JTextField textField = (JTextField)getComponent();
                    textField.setBorder(new LineBorder(Color.red));
                    textField.selectAll();
                    textField.requestFocusInWindow();

                    JOptionPane.showMessageDialog(
                        null,
                        "Please enter string with 5 letters.",
                        "Alert!",JOptionPane.ERROR_MESSAGE);
                    return false;
                }
            }
            catch(ClassCastException exception)
            {
                return false;
            }

            return super.stopCellEditing();
        }

        public Component getTableCellEditorComponent(
            JTable table, Object value, boolean isSelected, int row, int column)
        {
            Component c = super.getTableCellEditorComponent(
                table, value, isSelected, row, column);
            ((JComponent)c).setBorder(new LineBorder(Color.black));

            return c;
        }

    }

    public static void main(String [] args)
    {
        JFrame frame = new TableEdit();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

答案 2 :(得分:1)

扩展AbstractTableModel并安排它包含Set,以排除重复元素。正如@camickr所建议的那样,您需要custom cell editor来传达结果失败的添加内容。