Pregunta

Estoy intentando superponer las imágenes sobre una imagen de fondo utilizando las utilidades Java estándar. Vea las imágenes a continuación ...

Tengo un código que parece crear la imagen de fondo (¿puedes verificar que realmente funciona?) Y he creado una extensión de jpanel que uso para mostrar imágenes (la clase se llama imagePanel)

Sin embargo, cuando se lanza el programa, el JFRame solo muestra la segunda imagen, que luego se mueve a medida que se redimensiona la ventana.

Me gustaría tener la ventana abierta inicialmente con la imagen de fondo tomando la totalidad del espacio de la ventana. Entonces me gustaría que se muestre la segunda imagen en la parte superior, en la ubicación que especifique.

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 alt http://img189.imageshack.us/img189/9739/image1qi.jpg

texto alt http://img186.imageshack.us/img186/1082/image2ll.jpg

¿Fue útil?

Solución

Puede establecer el tamaño preferido del panel de fondo en el tamaño de la imagen:

backgroundPanel.setPreferredSize(new Dimension(
    backgroundImage.getIconWidth(), backgroundImage.getIconHeight()));

Yo abogaría por el enfoque de @Camickr. No haber experimentado previamente con setBounds() Yo mismo, aquí hay un ejemplo simple para ver el efecto:

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; }
    }
}

Otros consejos

Me gustaría tener la ventana abierta inicialmente con la imagen de fondo tomando la totalidad del espacio de la ventana.

Luego, simplemente cree un jlabel con un icono y use la etiqueta como panel de contenido del marco. Cuando empaquete el marco, asumirá el tamaño de la imagen.

Entonces me gustaría que se muestre la segunda imagen en la parte superior, en la ubicación que especifique.

Use un diseño nulo para la etiqueta anterior. Ahora puede crear JLabels adicionales con iconos y agregarlos al panel de contenido y publicarlos usando SetBounds.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top