Imagem no fundo do JTable (Como inserir uma imagem no background de um JTable)
19 respostas
R
rafael_next
Olá Pessoal!
Andei pesquisando na net e encontrei apenas um tópico sobre o assunto, mas testei e não funcinou! :(
Vejam: http://www.codeguru.com/java/articles/177.shtml
O objetivo é inserir uma imagem no fundo de um JTable de preferência com as linhas zebradas.
Alguem sabe como posso fazer isso?
Cara… eu sei como colocar uma imagem JPanel… não sei se ajuda…
Da uma pesquisada em JImagePanel…
Abs
M
Marky.Vasconcelos
Boa pergunta, não sei se é possivel.
As celulas da JTable são renderizadas cada uma com um JComponent, talvez seja possivel criar uma classe que extenda JTable, renderizar uma imagem de fundo, e criar um CellRenderer que devolva um JComponent semi-transparente para ser colocada na tabela.
R
rafael_next
Dê uma olhada no link que passei, lá eles conseguiram fazer.
O grande problema é que aquele tópico é de 1999, então a versão da MVJ devia ser bem antiga.
Eu consegui inserir uma imagem na tabela, mas ela só aparece até onde tem linhas.
Para isso eu estendi um JTable e sobre-escrevi o método:
public void paint( Graphics g )
{
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(image.getImage(), 0, 0, this.getWidth(), this.getHeight(), null);
g2d.dispose();
}
Como posso fazer ele mostrar a imagem mesmo não existindo linhas?
V
ViniGodoy
Você jamais deve sobrescrever o método paint de um componente do Swing;
Você deve criar uma cópia do objeto Graphics passado por parâmetro;
Você não deve dar dispose no objeto Graphics recebido por parâmetro;
O que não funcionou no código que você passou? Ele me parece java bem padrão. Dá algum erro?
E
entanglement
Acho que dependendo do Look & Feel, esse código que ele achou não vai funcionar.
Eu estou tentando usar um código semelhante ao que ele achou em uma JTable com Look & Feel Nimbus, e realmente não funciona (acho que o “setOpaque (false)” simplesmente não funciona com o SynthTableCellRenderer que é usado internamente pelo Nimbus )
Pelo que imagino, teria de saber um monte de detalhes do Nimbus que só estudando o código para poder mexer.
(Só para dar um exemplo: como é que você muda a cor da JProgressBar do Nimbus, que é laranja? Não é trivial, e uma coisa pior ainda: se mudar essa cor para uma JProgressBar, muda de todos os outros ProgressBars. Que coisa absurda)
R
rafael_next
Veja a imagem em anexo.
A imagem de fundo da tabela aparece somente onde há linhas, entende?
Na minha necessidade a imagem deveria continuar a até o final da tabela.
V
ViniGodoy
Bom, pelo que eu sei dos componentes do Swing, geralmente é uma má idéia tentar modificar o desenho deles.
Ou a coisa já funciona por padrão, e ele te dá ganchos para isso, ou esqueça.
E
entanglement
Ah, esse é outro problema.
Então não é o look & feel (já que você está usando o Metal ou o System) e sim o fato de o paint desse código só pintar, no seu caso, até Dimension d = getSize();
que é o tamanho da JTable dentro do JScrollPane.
R
rafael_next
Eu já coloquei o seguinte código e a imagem ficou cortada onde termina as linhas. :roll:
Quando você tenta pintar um componente Swing, se não me engano a pintura é “clipada” na dimensão que ele tem (a JTable vai só onde terminam as linhas, como você deve ter visto). Mesmo que você use esse artifício de somar 50 (poderia estar somando qualquer outro valor), continha a ficar “clipada”).
Não sei se é possível você pintar o JScrollPane e então deixar a JTable com setOpaque = false; só testando (e lembrando que setOpaque não funciona direito para o que você quer fazer no Look & Feel Nimbus, ou qualquer L&F derivado do Synth.
M
Marky.Vasconcelos
Na pior das hipoteses, desenhe no JScrollPane e modifique o CellRenderer da JTable para que seja semi-transparente.
R
rafael_next
As células estão transparentes!
O problema é fazer o desenho acompanhar até o final da tabela mesmo sem linhas.
Vou tentar fazer uma nova JTable, se conseguir eu posto aqui!
Só postei esse tópico para ver se alguém tinha pronto, mas valeu!
J
jean.zunino
Rafael,
Quando eu fiz um jogo de xadrez, para colocar a imagem do tabuleiro no fundo da JTable, fiz assim.
Problema resolvido!
Obrigado a todos que ajudaram!
Seguem os códigos:
BIBLIOTECA NECESSÁRIA
packetJTablePlus;importjava.awt.*;importjavax.swing.ImageIcon;importjavax.swing.border.*;/** * * @author Rafael P. Monteiro */publicclassCentredBackgroundBorderimplementsBorder{privatefinalImageIconimage;publicCentredBackgroundBorder(StringsImg){this.image=newImageIcon(getClass().getResource(sImg));}publicvoidpaintBorder(Componentc,Graphicsg,intx,inty,intwidth,intheight){intx0=x+(width-image.getIconWidth())/2;inty0=y+(height-image.getIconHeight())/2;g.drawImage(image.getImage(),x0,y0,null);}publicInsetsgetBorderInsets(Componentc){returnnewInsets(0,0,0,0);}publicbooleanisBorderOpaque(){returntrue;}}
Utilizei esse código e funcionou, se alguem tentar e não conseguir poste aqui!
OBS: Estou utilizando NetBeans, por isso não coloquei as instânciações de alguns objetos.
E
entanglement
De fato, se fizer as coisas direitinho de acordo com o exemplo do Code Ranch, funciona direitinho - mesmo com o Nimbus (só que é preciso ajeitar um pouco o Nimbus porque você acaba perdendo aquela característica de mostrar um fundo zebrado, e a linha corrente fica ressaltada em uma cor inadequada).
J
jean.zunino
rafael_next ,
A classe JComponent é uma classe abstrata onde todos os componentes Swing de extende dela e herdam suas funcionalidades.
Ela se encontra em javax.swing.JComponent.