Convalidamento e evidenzia la cella jtable
-
27-10-2019 - |
Domanda
Sto evidenziando JTable
celle basate sulla validazione. In alcune condizioni, devo prendere il valore di altre colonne. Ad esempio, se column2
allora ha gli Stati Uniti column3
dovrebbe essere solo numerico. Come un altro esempio, se col2
è "USA" e col4
è numerico, quindi col5
Dovrebbero essere solo tre carattere. Qualcuno può suggerire come si può fare?
Nel frammento sottostante, col3
contiene nomi di paesi; col4
e col5
dipende da col3
. Quando sono dentro case 3
e in case 4
, Non posso controllare il valore di case 2
. Ad esempio, voglio come, if (col3.value == "USA")
.
[code]
tcol = editorTable.getColumnModel().getColumn(0);
tcol.setCellRenderer(new CustomTableCellRenderer());
tcol = editorTable.getColumnModel().getColumn(1);
tcol.setCellRenderer(new CustomTableCellRenderer());
tcol = editorTable.getColumnModel().getColumn(2);
tcol.setCellRenderer(new CustomTableCellRenderer());
public class CustomTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent (JTable table, Object
value,boolean isSelected, boolean hasFocus, int row, int col){
Component cell = super.getTableCellRendererComponent(table, value,
isSelected,hasFocus, row, col);
if (value instanceof String) {
String str = (String) value;
switch (col) {
case 0:
col1(str, cell);
break;
case 1:
col2(str, cell);
break;
case 2:
col3(str, cell);
break;
}
}
return cell;
}
private void col1(String str, Component cell) {
if(!str.matches("[0-9a-zA-z]")){
cell.setBackground(Color.RED);
} else {
cell.setBackground(Color.GREEN);
}
}
private void col2(String str, Component cell) {
if(!str.matches("[A-Z]{3}")){
cell.setBackground(Color.RED);
} else {
cell.setBackground(Color.GREEN);
}
}
[/code]
Soluzione
@kleopatra e @mkorbel sono corretti. Il tuo frammento è incompleto, ma esso appare Come se stessi cercando di risolvere i problemi di editor e modellare nel rendering.
È possibile convalidare i valori inseriti in un'usanza TableCellEditor
, come mostrato in questo esempio. Puoi gestire dipendente colonne nel TableModel
, come mostrato in questo esempio.
In un commento dici: "Se non ho torto, prepareRenderer()
Ha bisogno di looping di tutte le file, giusto? "
No, JTable
"Le implementazioni interne utilizzano sempre questo metodo per preparare i rendering in modo che questo comportamento predefinito possa essere sovrascritto in modo sicuro da una sottoclasse." Prevalente prepareRenderer()
è molto utile quando le modifiche devono essere applicate selettivamente tutto rendering.
Vedere Concetti: redattori e rendering per ulteriori dettagli.