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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top