Problema Java JFrame Pack ()
-
25-09-2019 - |
Pergunta
Estou tentando sobrepor imagens em cima de uma imagem de fundo usando os utilitários Java padrão. Veja as fotos abaixo ...
Eu tenho código que parece criar a imagem de fundo (você pode verificar se ela realmente funciona?) E eu criei uma extensão do JPanel que eu uso para exibir imagens (a classe é chamada de ImagePanel)
No entanto, quando o programa é lançado, o JFRame está mostrando apenas a segunda imagem, que é movida por volta à medida que a janela é redimensionada.
Eu gostaria de abrir a janela inicialmente com a imagem de fundo que ocupava a totalidade do espaço da janela. Eu gostaria de exibir a segunda imagem em cima, no local que especificar.
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
JPanel backgroundPanel = new JPanel();
ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
JLabel background = new JLabel(backgroundImage);
background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
backgroundPanel.setOpaque(false);
frame.setContentPane(backgroundPanel);
ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png");
JPanel cardContainer = new JPanel(new FlowLayout());
frame.getContentPane().add(cardContainer);
cardContainer.add(button);
cardContainer.setBounds(100, 600, 200, 200);
frame.pack();
frame.setVisible(true);
}
}
TEXTO DE ALT HTTP://IMG189.IMAGESHACH.US/IMG189/9739/IMAGE1QI.JPG
TEXTO DE ALT HTTP://IMG186.IMAGESHACK.US/IMG186/1082/IMAGE2LL.JPG
Solução
Você pode definir o tamanho preferido do painel de fundo para o tamanho da imagem:
backgroundPanel.setPreferredSize(new Dimension(
backgroundImage.getIconWidth(), backgroundImage.getIconHeight()));
Eu defenderia a abordagem de @Camickr. Não tendo experimentado anteriormente com setBounds()
Eu mesmo, aqui está um exemplo simples para ver o efeito:
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JLabel label = new JLabel(new ElliptIcon(380, 260, Color.red));
label.setLayout(new GridLayout(2, 2));
frame.setContentPane(label);
for (int i = 0; i < 4; i++) {
label.add(new JLabel(new ElliptIcon(100, 60, Color.blue)));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static class ElliptIcon implements Icon {
private int w, h;
private Color color;
public ElliptIcon(int w, int h, Color color) {
this.w = w;
this.h = h;
this.color = color;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(color);
g.fillOval(x, y, w, h);
}
@Override
public int getIconWidth() { return w; }
@Override
public int getIconHeight() { return h; }
}
}
Outras dicas
Eu gostaria de abrir a janela inicialmente com a imagem de fundo que ocupava a totalidade do espaço da janela.
Em seguida, basta criar um Jlabel com um ícone e usar o rótulo como o painel de conteúdo do quadro. Quando você empacotar o quadro, será assumido o tamanho da imagem.
Eu gostaria de exibir a segunda imagem em cima, no local que especificar.
Use um layout nulo para o rótulo acima. Agora você pode criar jlabels adicionais com ícones e adicioná -los ao painel de conteúdo e postá -los usando Setbounds.