2011-05-19 27 views
0

我有一個Jtable允許編輯和插入。如何使Jtable禁止重複

編輯列時,可以說「ID」,我想檢查一下,如果插入的記錄或編輯後的記錄與其他記錄具有重複的「ID」列值。不允許。

實際上,具體而言,如果某人正在編輯ID列,當他點擊「Enter」或將焦點移至另一個單元格時,請執行檢查,如果ID重複,則不允許編輯。

我該怎麼做?

+0

Leon,在上面的評論中你有兩個很好的答案。 @Bala R和@trashgod - 創建答案讓Leon可以接受。 – CPerkins 2011-05-19 18:52:58

回答

1

如果有人正在編輯ID列,當他點擊「Enter」或將焦點移到另一個單元格時,執行檢查,如果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); 
    } 
} 
+0

+1自定義'CellEditor'。數據模型可能拒絕重複,但用戶需要反饋。 – trashgod 2011-05-20 05:43:28

1

延伸DefaultTableModel並覆蓋檢查重複的添加和更新方法,並將此類用於JTable