Borda em Célula do JTable

Como faço para retirar essa borda quando seleciona um item? Única forma que descobri era o focus em false, ele remove a borda porém não movimenta as setas na lista.

Vc teria que alterar ou criar o TableCellRenderer

public class CustomTableCellRenderer extends DefaultTableCellRenderer {

    private static final Border emptyBorder = BorderFactory.createEmptyBorder();

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int col) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, col);
        // if (isSelected)
        c.serBorder(emptyBorder);
        return c;
    }
}

Eu tentei esse TableCellRenderer que você mostrou porém, ta dando erro na linha c.serBorder(emptyBorder); Acho que seria “setBorder” mas mesmo assim continua com erro…

então tente:

    JComponent c = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, col);
    // if (isSelected)
    c.setBorder(emptyBorder);

Agora sumiu os erros testei mas continua a borda. Eu precisava confiar isso colocando a cor da linha em amarelo de novo ao selecionar. Porém o meu código da cor não se encaixa nesse TableCellRenderer. Precisava testar isso para ver se realmente continua o bordado

Fiz um teste aqui, seria isso que vc procura?

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;

public class CustomTableCellRenderer extends DefaultTableCellRenderer {

	private static final Border yellowBorder = BorderFactory
			.createLineBorder(Color.YELLOW);
	private static final Border whiteBorder = BorderFactory
			.createLineBorder(Color.WHITE);
	private static final Border grayBorder = BorderFactory
			.createLineBorder(Color.LIGHT_GRAY);

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int col) {
		JComponent c = (JComponent) super.getTableCellRendererComponent(table,
				value, isSelected, hasFocus, row, col);
		if (isSelected) {
			c.setBackground(Color.YELLOW);
			c.setBorder(yellowBorder);
		} else {
			if (row % 2 == 0) {
				c.setBackground(Color.WHITE);
				c.setBorder(whiteBorder);
			} else {
				c.setBackground(Color.LIGHT_GRAY);
				c.setBorder(grayBorder);
			}
		}
		return c;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JTable table = new JTable(
				new Object[][] { { "conteudo11", "conteudo12" },
						{ "conteudo21", "conteudo22" },
						{ "conteudo31", "conteudo32" },
						{ "conteudo41", "conteudo42" } }, new Object[] { "c1",
						"c2" });

		table.setShowGrid(false);
		table.setIntercellSpacing(new Dimension(0, 0));

		CustomTableCellRenderer cellRenderer = new CustomTableCellRenderer();
		table.getColumn("c1").setCellRenderer(cellRenderer);
		table.getColumn("c2").setCellRenderer(cellRenderer);

		frame.getContentPane().add(table);
		frame.pack();
		frame.show();
	}
}

@diego12 Consegui colocar a cor, porém descobri outro problema. É sobre a imagemIcon quando eu desativo o Render de Imagem e Texto ele funciona normal. Agora quando eu ativo fica igual a imagem a baixo, somente uma coluna renderiza. Estanho de mais isso…

@diego12 Testei esse seu código mandado agora mesmo e está acontecendo a mesma coisa, que eu falei agora pouco. Não está renderizando a imagem e o texto. porém funciona a linha selecionada sem borda.

O valor da coluna seria a classe TextAndIcon?
Se for então observe que o método getTableCellRendererComponent tem o parametro Object value que é o valor da célula, então:

// faça o cast para o jlabel
JLabel cell = (JLabel) super.getTableCellRendererComponent(table,
				value, isSelected, hasFocus, row, col);

if (value instanceof TextAndIcon && col == 0) {
    TextAndIcon textAndIcon = (TextAndIcon) value;
    cell.setText(textAndIcon.getText());
    cell.setIcon(textAndIcon.getIcon());
}

Sim, a coluna 0 é País, e a 1 é o Ranking. A classe TextAndIcon recebe os getString e getIcon, os sets deles também. @diego12 Opa, parece que agora está dando certo. Só que duplicou a imagem para as duas coludas…

Ah, um detalhe, desculpa, não queria que intercalasse a cor. Teria como tirar? Desde já, agradeço a sua ajuda

if (isSelected) {
	cell.setBackground(Color.YELLOW);
} else {
	cell.setBackground(Color.WHITE);
}
if (col == 0) {
    TextAndIcon textAndIcon = (TextAndIcon) value;
    cell.setText(textAndIcon.getText());
    cell.setIcon(textAndIcon.getIcon());
} else {
    cell.setText(value.toString());
    cell.setIcon(null);
}

O DefaultTableCellRenderer reaproveita o componente, então é necessário resetar o ícone.

Consegui, deu certo. Agora só falta um detalhe. Como faço para colocar também o setForeground color.BLACK e retirar aquele cor cinza para linhas intercaladas que você colocou? Não quero que fique intercalando cor na exibição.

if (isSelected) {
	cell.setBackground(Color.YELLOW);
} else {
	cell.setBackground(Color.WHITE);
}

Se não funcionar, acrescente:

cell.setOpaque(true);

e para mudar a cor do texto, só acrescentar:

cell.setForeground(Color.BLACK);

Consegui de outra forma, setando a cor em null. Muito obrigado @diego12 consegui, deu tudo certo. Só tenho a agradecer. Se alguém tiver essa dúvida, segue o código.

public class CustomTableCellRenderer extends DefaultTableCellRenderer {

Border yellowBorder = BorderFactory
.createLineBorder(Color.YELLOW);
Border whiteBorder = BorderFactory
.createLineBorder(Color.WHITE);

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
JLabel c = (JLabel) super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, col);
if (isSelected) {
c.setBackground(Color.YELLOW);
c.setForeground(Color.BLACK);
c.setBorder(yellowBorder);
} else {
if (row % 2 == 0) {
c.setBackground(Color.WHITE);
c.setBorder(whiteBorder);
} else {
c.setBackground(null);
c.setBorder(null);
}
}

            if (value instanceof TextAndIcon) {
                setIcon(((TextAndIcon) value).icon);
                setText(((TextAndIcon) value).text);
            } else {
                setText((value == null) ? "" : value.toString());
                setIcon(null);
            }
            
  return c;

}
}

Mais um detalhe, para melhor alinhamento das imagens só alterar a cor, pois as bandeiras ficaram um pouquinho fora do eixo pelo motivo no qual uma linha tava setando uma cor e na outra estava um valor nulo. Resolução: Colocar tanto as linhas pares e ímpares em null ou com cor em ambas.

if (row % 2 == 0) {
c.setBackground(null);
c.setBorder(null);
} else {
c.setBackground(null);
c.setBorder(null);
}