Przechodzenie obrazów

0

Mam problem, którego nie jestem pewien jak ugryźć. Poniższy kod wyrzuca błąd czasu wykonania na końcu metody renderowanie(). Jest to mocno uproszczona wersja bardziej skomplikowanego komponentu, ale jego celem było uzyskanie tego samego błędu w tym samym miejscu i chyba z tego samego powodu.
W skrócie chodzi o to, że komponent co jakiś czas renderuje i odrysowuje się sam na ekranie (powierzchni komponentu). Zmiana rozmiaru komponentu ma powodować, że kolejne renderowanie ma działać już na nowej, dopasowanej wielkości bufora.
Metoda renderowanie(Grapghics2D g) pierwotnie miała do dyspozycji dwa obrazy pobierane z plików ,które były ostatnią instrukcją nakładane na siebie z jakimś poziomem przezroczystości. Tu dla uproszczenia obrazy są tworzone w locie i wypełniane kolorem i napisami. W ten sposób sądziłem, że znikną problemy z niezgodnością modeli kolorów. Ale najwyraźniej to nie pomaga bo ten sam problem nadal występuje mimo tego, że dla obu obrazków używam do utworzenia BufferedImage tej samej metody.

Bez instrukcji drawImage, która ma składać dwa obrazy z określonym stopniem przezroczystości wszystko chodzi jak należy. Jednak po jej włączeniu wyrzucany jest błąd niezgodności chyba formatu koloru obrazka z formatem drugiego obrazka (nakładanego).

Gdzie robię błąd? I dlaczego?

package Kandydaci;
import Olamagato.GUI;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import javax.swing.JComponent;
import javax.swing.Timer;

public class ZłyKomponent extends JComponent
{
    private int prześwit;
    private BufferedImage bufor;
    private boolean aktualny = false;

    public void ustPrzezroczystość( int value ) { prześwit = value; }

    public ZłyKomponent()
    {
        setPreferredSize(new Dimension(400, 400));
        addComponentListener(new ComponentAdapter()
        {
            @Override public void componentResized( ComponentEvent e )
            { zmieńBufor(getSize()); aktualny = false; }
        });
        zmieńBufor(getPreferredSize());
        //samodzielne odrysowywanie co 1/4 sekundy
        this.setIgnoreRepaint(true);
        new Timer(250, new ActionListener()
        {
            public void actionPerformed( ActionEvent e )
            { renderowanie(); PaintScreen(); }
        }).start();
    }

    private synchronized void zmieńBufor(Dimension rozm)
    { bufor = nowyObraz(rozm); }

    private BufferedImage nowyObraz( Dimension rozm )
    {
        return GUI.getDefGraph()
          .createCompatibleImage(rozm.width, rozm.height);
    }

    public synchronized final void renderowanie()
    {
        if(!aktualny)
        {
            zmieńBufor(getSize());
            aktualny = true;
        }
        Graphics2D g = bufor.createGraphics();
        renderowanie(g);
        g.dispose();
    }

    public void renderowanie(Graphics2D g)
    {
        Dimension rozm = this.getSize();

        //obraz nr 1
        Font f = new Font("Dialog", Font.BOLD, 36);
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, rozm.width, rozm.height);
        g.setColor(Color.BLACK);
        g.setFont(f);
        GUI.drawCenterString("Obrazek pierwszy", g, this.getBounds());

        //obraz nr 2
        BufferedImage obrazekNakładany = nowyObraz(rozm);
        Graphics2D gx = obrazekNakładany.createGraphics();
        gx.setColor(Color.ORANGE);
        gx.fillRect(0, 0, rozm.width, rozm.height);
        gx.setColor(Color.BLUE);
        gx.setFont(f);
        GUI.drawCenterString("Obrazek drugi", gx, this.getBounds());
        gx.dispose();

        float[] mnożone = { 1f, 1f, 1f, prześwit/100f };
        float[] sumowane = { 0f, 0f, 0f, 0f };
        g.drawImage(obrazekNakładany,
            new RescaleOp(mnożone, sumowane, null), 0, 0); //<--
        //Exception:
        //java.lang.IllegalArgumentException: Number of scaling constants does
        //not equal the number of of color or color/alpha  components
    }

    private synchronized void PaintScreen()
    {
        Graphics g = this.getGraphics();
        g.drawImage(bufor, 0, 0, null);
        g.dispose();
    }
}
0

Jeśli wywala jakiś błąd, to daj kod błędu.

0

@ktoś, to ci nie wystarczyło ?

                g.drawImage(obrazekNakładany,
                        new RescaleOp(mnożone, sumowane, null), 0, 0); //<--
                //Exception:
                //java.lang.IllegalArgumentException: Number of scaling constants does
                //not equal the number of of color or color/alpha  components

@olamagato, przez pewien czas też używałem polskich nazw zmiennych. Zostałem nawrócony przez środowisko JCreator, które sobie z nimi nie radziło. Java dopuszcza, niektóre środowiska nie. Nie wiadomo w jaki środowisku przyjdzie poprawiać kod.

0
bogdans napisał(a)

Zostałem nawrócony przez środowisko JCreator, które sobie z nimi nie radziło. Java dopuszcza, niektóre środowiska nie. Nie wiadomo w jaki środowisku przyjdzie poprawiać kod.

Prawda. Ale jeżeli jest do dyspozycji refactoring, to kwestia nazewnictwa zmiennych i ich kodowania jest drobiazgiem. Tym bardziej, że można to puścić automatem, mogącym tłumaczyć zmienne w locie. Na razie dopóki się uczę jest to wygodne.

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