Swing Komponente in Graustufen zeichnen

xehpuk

Top Contributor
Hi!

Ich bin auf der Suche nach einem (einfachen) Weg, eine Komponente und deren Subkomponenten nur in Graustufen zeichnen zu lassen.
Gibt es diesen überhaupt?

Bisher habe ich probiert, in den überschriebenen paint*-Methoden der Komponente die Graphics in einen Proxy zu setzen und diesen dann mit überschriebenem set/getColor() – diese wandeln die RGB-Werte in Graustufen um – an super.paint* weiterzureichen (die restlichen Methoden delegieren einfach an die ursprüngliche Graphics weiter).

Dies hat aber keinen Einfluss, wenn es darum geht, die Subkomponenten zu zeichnen.

Ein (steiniger) Weg wäre etwa, bei allen Komponenten, die man einsetzt, die set/getForeground() und set/getBackground() zu überschreiben. Das fänd ich jetzt nicht so praktikabel, zumal je nach Look and Feel weitere Farben (nicht zu vergessen die UIProperties) dazukommen.

Kann ich Java mitteilen, dass das System nur Graustufen kennt und es somit dazu verleiten, alles nur in Graustufen zu zeichnen?
 
Zuletzt bearbeitet:
Hm... KÖNNTE kompliziert werden. Hab's gerade mal versucht:
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.RepaintManager;

class GrayscalePanel extends JPanel
{
    private BufferedImage image = null;

    public void paint(Graphics g)
    {
        if (image == null || image.getWidth() != getWidth() || image.getHeight() != getHeight())
        {
            image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_BYTE_GRAY);
        }
        Graphics2D gr = image.createGraphics();
        super.paint(gr);
        gr.dispose();
        g.drawImage(image,0,0,null);
    }
}

public class GrayscaleComponentsTest
{
    private static void initRepaintManager()
    {
        RepaintManager.setCurrentManager(new RepaintManager()
        {
            @Override
            public void addDirtyRegion(
                JComponent c, int x, int y, int w, int h)
            {
                JComponent r = c.getRootPane();
                if (r != null)
                {
                    super.addDirtyRegion(r, 0,0,r.getWidth(),r.getHeight());
                }
                else
                {
                    super.addDirtyRegion(c, 0,0,w,h);
                }
            }

            @Override
            public void paintDirtyRegions()
            {
                super.paintDirtyRegions();
            }
        });
    }
    
    public static void main(String args[])
    {
        initRepaintManager();
        
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p = new GrayscalePanel();
        p.add(new JButton("Hallo"));
        f.getContentPane().add(p);
        f.pack();
        f.setVisible(true);
    }
}
aber das ist ein ziemlicher Hack.

Nur nebenbei: Wenn du ohnehin einen Schwarzweiß-Fernseher an deinen Core i7 anschließt, wozu dann das ganze nochmal explizit grau in grau machen?
 
Ah, an so etwas habe ich auch schon überlegt. Nur mit dem RepaintManager habe ich noch nie gearbeitet, das muss ich mal nachholen. 🙂

Wenn du ohnehin einen Schwarzweiß-Fernseher an deinen Core i7 anschließt, wozu dann das ganze nochmal explizit grau in grau machen?
Die Mitteilung an Java sollte eine Lüge sein, um es zu überlisten! Ich habe einen Schwarz-Weiß-Fernseher noch nicht mit eigenen Augen gesehen. 😛
Einen Core i7 habe ich auch noch nicht. 🙁

Ich hacke mir grad ohne Beachtung von Patterns ein MineSweeper zusammen und orientiere mich dabei an der Version von Windows XP. Dort gibts im Menü auch die Option, die Farben zu deaktivieren. Sieht dort nur recht retro aus (und diente wohl tatsächlich der Ressourcenschonung?) und ich wollts nun auch nur ungefähr nachstellen. Aber sieht so weit gut aus, danke!
 

Neue Themen


Zurück
Oben