Основываясь на «типе», ячейка JTable должна переключиться с текстового поля на JComboBox - PullRequest
0 голосов
/ 26 марта 2020

Несмотря на то, что есть много примеров того, как поместить 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.
        }

Можно ли это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...