Pessoal, alguém sabe como fazer um objeto JPanel que tem um JButton inserido conseguir adicionar um outro objeto JPanel sem que os componentes adicionados no primeiro JPanel apareçam sobre o segundo JPanel? :shock: Isso tudo usando SpringLayout?
Calma, vou tentar explicar melhor, não desista de ler! Rode o código seguinte para conseguir o primeiro sintoma:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Janela extends JFrame {
private JPanel painelPrincipal;
private JPanel painelSecundario;
private JButton botaoPainelPrincipal;
public Janela() {
super("Testando sobreposição de JPanel`s");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500,500);
exibir();
}
public void exibir() {
SpringLayout layout = new SpringLayout();
painelPrincipal = new JPanel(layout);
painelPrincipal.setPreferredSize(new Dimension(400,400));
painelPrincipal.setBackground(Color.BLACK);
painelSecundario = new JPanel();
painelSecundario.setPreferredSize(new Dimension(200,200));
painelSecundario.setBackground(Color.BLUE);
botaoPainelPrincipal = new JButton("OK");
botaoPainelPrincipal.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
painelPrincipal.remove(painelSecundario);
painelPrincipal.repaint();
}
});
painelPrincipal.add(botaoPainelPrincipal);
painelPrincipal.add(painelSecundario);
add(painelPrincipal);
setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
new Janela();
}
});
}
}
Bom, você já deve ter notado que o botão (botão OK) que está adicionado no painel principal (painel em preto) é exibido como se estivesse adicionado ao painel secundário (painel azul), o que está errado. O correto seria o painel azul estar se sobrepondo à este botão, evitando que ele estivesse sendo exibido, assim como fez com parte do painel preto, porém é clara a prioridade do JButton sobre um JPanel. Muito bem, até aí, pesquisando e analisando a documentação do JPanel existe um método no qual você organiza a ordem dos componentes em um painel no qual sempre os primeiros componentes desta lista ganham a preferência sobre os últimos componentes na hora de pintá-los (mesmo sabendo que a solicitação para adicionar (add) o botão foi escrita no código primeiro que a do segundo painel, mas como Java é multithreading, justifica-se). Este método é o setComponentZOrder(Component c, int pos); Veja este novo código abaixo:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Janela extends JFrame {
private JPanel painelPrincipal;
private JPanel painelSecundario;
private JButton botaoPainelPrincipal;
public Janela() {
super("Testando sobreposição de JPanel`s");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500,500);
exibir();
}
public void exibir() {
SpringLayout layout = new SpringLayout();
painelPrincipal = new JPanel(layout);
painelPrincipal.setPreferredSize(new Dimension(400,400));
painelPrincipal.setBackground(Color.BLACK);
painelSecundario = new JPanel();
painelSecundario.setPreferredSize(new Dimension(200,200));
painelSecundario.setBackground(Color.BLUE);
botaoPainelPrincipal = new JButton("OK");
botaoPainelPrincipal.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
painelPrincipal.remove(painelSecundario);
painelPrincipal.repaint();
}
});
painelPrincipal.add(botaoPainelPrincipal);
painelPrincipal.add(painelSecundario);
add(painelPrincipal);
painelPrincipal.setComponentZOrder(painelSecundario, 0); // O método aplicado.
setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
new Janela();
}
});
}
}
Agora sim, parece perfeito! Só parece, não é… Repare que se você passar o mouse lá no canto superior esquerdo do painel azul o botão que está inserido (e escondido) por trás vai aparecer, provocando um efeito parecido com esta imagem postada em outro tópico neste mesmo fórum:
:arrow: [size=14]E agora? BUG eu sei que não é… Parece ser uma briga por um mesmo espaço, o que vai contra as leis básicas de Física mas… existe alguma solução para que este botão não apareça enquanto o painel azul não for removido?
Não tenha pressa em responder! Só de estar desprendendo do seu tempo em ler e chegar até aqui neste momento, para mim, é mais do que qualquer resposta. Sou muito grato!
Ótimo 2012 para todos, com muita paz![/size]