PNG, przezroczystość - komponent na tle panelu

0

Witam!

Znalazłem w sieci takowy kod. Ma on za zadanie wyświetlić obrazek. Nie bardzo rozumiem dlaczego wyświetla on obrazek tylko i wyłącznie na JFrame, nie wyświetla go już na JPanel. Chciałbym go wykorzystać do wyświetlania animacji 16 katkowej. W jaki sposób należy zmodyfikować ten kod, aby obraz był wyświetlany na panelu? Dobrze by było, żeby respektował kanał alpha i widać było to co jest "pod spodem". Dzięki

public class Test {
    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("Test");

        URL transPng = new URL("http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png");
        Image image = ImageIO.read(transPng);

        frame.add(new ImageComponent(image), BorderLayout.CENTER);

        // JLabel label = new JLabel(new ImageIcon(image));
        // label.setOpaque(false);
        // frame.add(label, BorderLayout.CENTER);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    static class ImageComponent extends JComponent {

        private Image image;

        public ImageComponent(Image image) {
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Rectangle r = g.getClipBounds();

            // paint bg
            int s = 10;
            for (int y = r.y / s; y < r.y + r.height; y += s) {
                int o = (y % (2*s) == 0 ? s : 0);
                for (int x = r.x / s + o; x < r.x + r.width; x += 2*s)
                    g.fillRect(x, y, s, s);
            }

            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }
    }
}
 
0

Jakieś dziwne rzeczy piszesz. Jak najbardziej można go używać jako panelu:


import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test2
{
	public static void main(String[] args) throws Exception
	{
		JFrame frame = new JFrame("Test");
		URL transPng = new URL("http://upload.wikimedia.org" +
			"/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png");
		Image image = ImageIO.read(transPng);
		frame.add(new ImageComponent(image), BorderLayout.CENTER);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
		frame.setVisible(true);
	}

	static class ImageComponent extends JPanel
	{
		private static final int SIZE = 10;
		private static final int SIZE2 = SIZE << 1;
		private Image image;
		private Rectangle r = new Rectangle();

		public ImageComponent(Image image)
		{
			this.image = image;
		}

		@Override protected void paintComponent(Graphics g)
		{
			super.paintComponent(g);
			r = g.getClipBounds(r);
			g.setColor(Color.MAGENTA);
			for(int shift = 0, y = r.y; y < r.y + r.height; y += SIZE) //rysowanie kratki
			{
				shift = shift == 0 ? SIZE : 0; //przesunięte dla nieparzystych
				for(int x = r.x + shift; x < r.x + r.width; x += SIZE2)
						g.fillRect(x, y, SIZE, SIZE);
			}
			g.drawImage(image, 0, 0, r.width, r.height, null); //rysowanie obrazka
		}
	}
}

Nieco poprawiłem ten przykład bo nie dość, że nieczytelny, to ma jeszcze niepotrzebne dzielenia, mnożenia, wywołania i przydziały pamięci.
ps. Z niewiadomego dla mnie powodu forum dokłada puste wiersze w kodzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1