2012-11-13 18 views
0

我有一個JTable有兩列(可編輯JTable)。當用戶鍵入的東西在第二列中,我的要求如下:如何操縱指定列上的JTable返回值?

  • 用戶只能打字許多頓號,

  • 當用戶鍵入錯誤的字符,它會發出蜂鳴(Toolkit.getDefaultToolkit().beep();

我該如何去做到這一點? (如果它的JTextField它需要文件濾波器或簡單的文件等,如果它的JTable,那麼如何?

回答

4

實現一個TableCellEditor是能夠返回一個文本成分(JTextField)的具有DocumentFilter連接到它能夠根據需要過濾傳入的文本。

你可能想看看

更新,示例

如果是jtextfield它需要文件過濾器或者普通文件等,如果它是 JTable,那麼怎麼樣?

閱讀教程,針對您遇到的問題提出問題。這一點很重要,你明白爲什麼事情以某種方式完成而不是簡單地複製和粘貼一些別人的代碼,否則當你複製的壞主意,你不會知道;)

public class TestFilteredCellEditor { 

    public static void main(String[] args) { 
     new TestFilteredCellEditor(); 
    } 

    public TestFilteredCellEditor() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FilteredEditorPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class FilteredEditorPane extends JPanel { 

     public FilteredEditorPane() { 
      setLayout(new BorderLayout()); 
      JTable table = new JTable(new MyTableModel()); 
      TableColumnModel columnModel = table.getColumnModel(); 
      columnModel.getColumn(1).setCellEditor(new FilteredTableEditor()); 
      add(new JScrollPane(table)); 
     } 
    } 

    public class FilteredTableEditor extends AbstractCellEditor implements TableCellEditor { 

     private JTextField editor; 

     public FilteredTableEditor() { 
      editor = new JTextField(); 
      ((AbstractDocument) editor.getDocument()).setDocumentFilter(new NumericDocumentFilter()); 
     } 

     @Override 
     public boolean isCellEditable(EventObject e) { 
      return true; 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return editor.getText(); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      if (value instanceof String) { 
       editor.setText((String) value); 
      } else { 
       editor.setText(null); 
      } 
      return editor; 
     } 
    } 

    public class NumericDocumentFilter extends DocumentFilter { 

     public void insertString(DocumentFilter.FilterBypass fb, int offset, 
       String string, AttributeSet attr) 
       throws BadLocationException { 

      StringBuilder buffer = new StringBuilder(string); 
      boolean isBad = false; 
      for (int i = buffer.length() - 1; i >= 0; i--) { 
       char ch = buffer.charAt(i); 
       if (!Character.isDigit(ch)) { 
        buffer.deleteCharAt(i); 
        isBad = true; 
       } 
      } 
      if (isBad) { 
       Toolkit.getDefaultToolkit().beep(); 
      } 
      super.insertString(fb, offset, buffer.toString(), attr); 
     } 

     public void replace(DocumentFilter.FilterBypass fb, 
       int offset, int length, String string, AttributeSet attr) throws BadLocationException { 
      if (length > 0) { 
       fb.remove(offset, length); 
      } 
      insertString(fb, offset, string, attr); 
     } 
    } 

    public class MyTableModel extends AbstractTableModel { 

     @Override 
     public int getRowCount() { 
      return 1; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      return ""; 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return true; 
     } 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      return String.class; 
     } 
    } 
} 
+0

感謝您指出的我的答案中的致命缺陷...沒有想到它通過:) +1爲你的! – Sujay

+0

+1爲什麼要重新發明輪子,放在那裏JFormattedTextField然後getColumnClass應該返回適​​當的類 – mKorbel

+0

hufh ..非常感謝..長期迴應道歉..原因是我仍然試圖解決這個在過去的幾天..我認爲沒有人會告訴我代碼..所以我不斷嘗試它(基於你的第一個答案),如果我已經解決了它,我會回到這裏..最後,我仍然不能解決它,直到你編輯你的答案..謝謝。 。但是我仍然不能在jtable中編寫一個數字(基於你的代碼),但我現在得到了這個觀點(基於你的代碼),非常感謝它。 –