Estou fazendo uma pesquisa e estou com dificuldades em resolver. Meu problema é: Quero colocar uma imagem de fundo em uma JDesktopPane.
Já vi alguns posts aqui, porém não consegui implementar nenhum com sucesso, apenas um, porém estou com um certo problema devido a um auto implement que o NetBeans faz naqueles espaços não editáveis.
Essa é minha classe que realiza a inserção da imagem no jDesktopPane:
[code]public class backGround extends JFrame{
private static Image img;
JDesktopPane desk;
public backGround(JFrame frame,JDesktopPane desk) {
try{
img = javax.imageio.ImageIO.read
(new java.net.URL(getClass().getResource("wall.png"), "wall.png"));
}catch(Exception e){
}
desk = new JDesktopPane(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(img != null){
g.drawImage(img, 0,0,this.getWidth(),this.getHeight(),this);
//g.drawString("Background Carregado com Sucesso!!!", (this.getWidth()/2), (this.getHeight()/2) );
}else
g.drawString("Image not found", 50,50);
}
};
frame.getContentPane().add(desk);
//frame.setSize(img.getWidth(null),img.getHeight(null));
frame.setVisible(true);
// Comando para que o programa execute maximizado
frame.setExtendedState(this.getExtendedState()|principal.MAXIMIZED_BOTH);
}
}[/code]
Chamada:
Essa classe funciona, ela consegue colocar a imagem no fundo da tela. Porém, ocorre algo muito estranho, simplesmente minhas outras telas que chamo para dentro do JdesktopPane, uso as JInternalFrame, não aparecem mais, a impressão que tenho é que elas ficam abertas em memória porém não visam visíveis.
Esse é meu método que chama as minhas JInternalFrame.
[code]public void addTelaDesk(JInternalFrame tela){
for (JInternalFrame jInternalFrame : jDesktopPane1.getAllFrames()) {
// se uma janela semelhante estiver aberta
if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
Object[] opções = {"OK"};
int qst = JOptionPane.showOptionDialog(null, "ESSA TELA JÁ ESTÁ ATIVA","Erro de abertura",
JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null,opções,opções[0]);
// se utilizar a aberta retorna e não abre outra,
// caso contrário sai do for e abre outra igual
if(qst == 0){
return;
}else if(qst == 1){
break;
}
}
}
jDesktopPane1.add(tela); //adiciona na tela
tela.setVisible(true); // seta visivel
tela.moveToFront();
}[/code]
Chamada:
NewJInternalFrame j = new NewJInternalFrame();
addTelaDesk(j);
Fazendo alguns testes percebi que o netBeans gera automaticamente este bloco aqui:
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
Que inclusive ele é protegido pelo betBeans, estou fazendo edição direto no arquivo .java.
Só mexendo neste bloco é que meu método funciona:
NewJInternalFrame j = new NewJInternalFrame();
addTelaDesk(j);
Fazendo alguns testes percebi que o netBeans gera automaticamente este bloco aqui:
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
//getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
Ai fazendo mais alguns testes consegue abrir as telas e mantendo a imagem, porém desta forma:
https://onedrive.live.com/redir?resid=16d41565280f44a7%21517
As JInternalFrame somente são abertas neste espaço em branco.
A impressão que tenho é que este bloco faz o redimensionamento da área do desktopPane e sobrescreve o meu método. Preciso achar um jeito de manipular esse código ou achar uma outra solução para inserir a imagem ou chamar as telas.
Espero ajuda de vocês. Abraço.