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);
}