使用编辑器validation表的单元格

我的JTable有一个密码字段编辑器。 我想在用户单击编辑另一个字段时,如果文本长度小于8位,则显示错误消息。 我尝试过焦点听众。 但它不起作用。 请帮助我,因为我刚刚开始使用java swing。

class PasswordEditor extends DefaultCellEditor { TextBox m_passWord = new TextBox(); public PasswordEditor() { super(new TextBox()); } @Override public Object getCellEditorValue() { return this.m_passWord.getText(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Object fieldValue = value; if(null == fieldValue) fieldValue = Constants.EMPTY_STRING; this.m_passWord.addInputMethodListener(new InputMethodListener() { @Override public void inputMethodTextChanged(InputMethodEvent event) { // TODO Auto-generated method stub } @Override public void caretPositionChanged(InputMethodEvent event) { // TODO Auto-generated method stub } }) this.m_passWord.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { if (!e.isTemporary()) { String content = PasswordEditor.this.m_passWord.getText(); System.out.println((content)); } } @Override public void focusGained(FocusEvent e) { //TODO init } }); this.m_passWord.setEditable(true); this.m_passWord.setText(fieldValue.toString()); return this.m_passWord; } } 

正如我理解这个问题,它是关于validation编辑器中的输入(保护自身免受无效值的模型是另一个故事,IMO)并在他/她尝试提交输入时通知用户他/她的错误。

这样做的一个简单方法是使用InputVerifier:

  • 在其validation方法中实现validation规则
  • 在其shouldYieldFocus中实现通知
  • 子类DefaultCellEditor并覆盖其stopCellEditing以调用shouldYieldFocus并返回其结果(又名:拒绝提交编辑)

一些代码片段:

 final InputVerifier iv = new InputVerifier() { @Override public boolean verify(JComponent input) { JTextField field = (JTextField) input; return field.getText().length() > 8; } @Override public boolean shouldYieldFocus(JComponent input) { boolean valid = verify(input); if (!valid) { JOptionPane.showMessageDialog(null, "invalid"); } return valid; } }; DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) { { getComponent().setInputVerifier(iv); } @Override public boolean stopCellEditing() { if (!iv.shouldYieldFocus(getComponent())) return false; return super.stopCellEditing(); } @Override public JTextField getComponent() { return (JTextField) super.getComponent(); } }; JTable table = new JTable(10, 2); table.setDefaultEditor(Object.class, editor); 

覆盖stopCellEditing()并在其中实现条件。

  class PasswordEditor extends DefaultCellEditor { TextBox m_passWord = new TextBox(); public PasswordEditor() { super(new TextBox()); } @Override public boolean stopCellEditing() { if(getCellEditorValue().toString().length() < 8) { JOptionPane.showMessageDialog(UsmUserView.this.m_Parent, "Password Must Be 8 Bytes Long !! Please Check"); return false; } fireEditingStopped(); return true; } @Override public Object getCellEditorValue() { return this.m_passWord.getText(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Object fieldValue = value; if(null == fieldValue) fieldValue = Constants.EMPTY_STRING; this.m_passWord.setEditable(true); this.m_passWord.setText(fieldValue.toString()); return this.m_passWord; } } 

覆盖stopCellEditing(),您可以尝试以下代码来获取错误单元格的焦点。

 class PasswordEditor extends DefaultCellEditor { private TextBox m_passWord = new TextBox(); public PasswordEditor() { super(new TextBox()); } @Override public boolean stopCellEditing() { if(getCellEditorValue().toString().length() < 8) { // Text box will get the focus and will shown in Red line as border for that cell. TextBox aTextBox = (TextBox)getComponent(); aTextBox.setBorder(new LineBorder(Color.red)); aTextBox.selectAll(); aTextBox.requestFocusInWindow(); JOptionPane.showMessageDialog(UsmUserView.this.m_Parent, "Password Must Be 8 Bytes Long !! Please Check"); return false; } return super.stopCellEditing(); } @Override public Object getCellEditorValue() { return this.m_passWord.getText(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Object fieldValue = value; if(null == fieldValue) fieldValue = Constants.EMPTY_STRING; this.m_passWord.setEditable(true); this.m_passWord.setText(fieldValue.toString()); return this.m_passWord; } }