Несмотря на то, что есть много примеров того, как поместить JCombobox вместо текстового поля в SO (путем переключения между двумя редакторами), я хочу немного сложнее.
Я использую следующий метод для заполнения моей таблицы:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col )
{
if (((JobCustomWorkUnit)param.getModel()).isEditbale(row))
{
if (col == 1)
varLabel.setEnabled(true);
}
else
{
if (col == 1)
varLabel.setEnabled(false);
}
switch( col )
{
case 0 :
renderJTable.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,col);
if (isSelected)
{
renderJTable.setBackground(table.getSelectionBackground());
}
else
{
if (((JobCustomWorkUnit)param.getModel()).isMandatory(row))
renderJTable.setBackground(LIGHT_YELLOW);
else
renderJTable.setBackground(UIManager.getColor("Table.background"));
}
return renderJTable;
case 1 :
varLabel.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
if (isSelected)
{
renderJTable.setBackground(table.getSelectionBackground());
}
else
{
if (((JobCustomWorkUnit)param.getModel()).isMandatory(row))
varLabel.setBackground(LIGHT_YELLOW);
else
varLabel.setBackground(UIManager.getColor("Table.background"));
}
String valueStr = value.toString();
String defaultStr =((JobCustomWorkUnit)param.getModel()).getDefault(row);
String type = ((JobCustomWorkUnit)param.getModel()).getType(row);
if (valueStr == null || valueStr.length() == 0 ) {
varLabel.setVText(defaultStr);
}
if (((JobCustomWorkUnit)param.getModel()).isValueCrypt(row) || type.equalsIgnoreCase("password"))
{
varLabel.setVText("********");
}
if (type.equalsIgnoreCase("user")){
}
return varLabel;
}
return null;
}
Переменная varLabel
здесь является экземпляром пользовательского класса, где метод setVText()
имеет следующий вид:
public void setVText( String s )
{
int pos;
String ss;
VariableView vv;
if( s.equals(vtext) ) return;
vtext = s;
tokens.clear();
try
{
pos = 0;
ArrayList<MatchResult> matches = getAllMatches(s, REGEXP_EXP);
for( MatchResult m : matches )
{
// R�cup�rer la cha�ne qui n'est pas une variable
ss = s.substring( pos, m.start() );
tokens.add( ss );
// R�cuperer xxxx qui correspond � une variable dans <$xxxxx>
ss = m.group(2);
//tab[i].toString(1);
vv = createVariableView( ss );
if( vv != null ) tokens.add( vv );
pos = m.end(1);
}
// Inserer la fin
ss = s.substring( pos );
tokens.add( ss );
}
catch( Exception ex )
{
LogFactory.createLog().error( "Erreur la chaine avec Variables semble �tre mal format�", ex );
tokens.clear();
}
}
Когда type
равняется строке, которую я использую вышеупомянутым методом, чтобы поместить текст в ячейку.
И, как вы можете видеть, я использую два различных getTableCellRendererComponent()
здесь:
Когда столбец равен 0, я использую getTableCellRendererComponent по умолчанию из DefaultTableCellRenderer.
Когда столбец равен 1, я использую тот, который у меня есть в классе VarLabel
, а именно:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
RENDER.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
setFont( RENDER.getFont() );
setBorder( RENDER.getBorder() );
setForeground( RENDER.getForeground() );
setBackground( RENDER.getBackground() );
setVText( value.toString() );
setOpaque( true );
return this;
}
Вот сложная часть. Теперь я хотел бы нарисовать JComboBox вместо текстового поля, когда type
равно "user".
if (type.equalsIgnoreCase("user")){
//so instead of doing varLabel.setVText(value) here and end up having a textfield, I would like to put a JComboBox instead.
}
Можно ли это сделать?