Hintergrundfarbe setzen in JPanel funktioneirt nicht

ernst

Top Contributor
Hallo allerseits,
Im folgenden, einfachen Grafikprogramm wird leider die Hintergrundfarbe nicht auf grün gesetzt:
In der Klasse KSZeichenfläche extends JPanel wird ein JButton und ein Objekt der Klasse
Malflaeche extends JPanel angeheftet.
Ich will die Hintergrundfarbe von Malflaeche auf Grün setzen.
Habe alles mögliche probiert (siehe Quellcode mit Kommentar "Hilft nichts" versehen).
Habe auch im Internet recherchiert.
Warum klappt das alles nicht?
Welchen Quellcode muß man einfügen, damit es funktioniert ?
Was ist so schwer daran, nur eine Hintergrundfarbe zu ändern ?
mfg
ern

Hier befindet sich das vollständige lauffähige Projekt:
Code:
package hintergrundtest1;
import javax.swing.event.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Startklasse {
    public static void main(String[] args) {
        KSZeichenflaeche ks = new KSZeichenflaeche();
        // Hilft nichts
        ks.setBackground(Color.GREEN);
        JFrame f = new JFrame();
        f.setSize(700, 800);
        f.getContentPane().add(ks);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Hilft nichts
        f.getContentPane().setBackground(Color.GREEN);
        f.setVisible(true);
        ks.getMalflaeche().maleInsBild();
        // Hilft nichts
        f.getContentPane().setBackground(Color.GREEN);
        // Hilft nichts    
        ks.setBackground(Color.GREEN);
    }
}

class KSZeichenflaeche extends JPanel {
    private Malflaeche malflaeche;

    public KSZeichenflaeche() {
        JButton buttonHilfe;
        Malflaeche malflaeche;
        GridBagLayout gbl;
        gbl = new GridBagLayout();
        buttonHilfe = new JButton("HILFE");
        malflaeche = new Malflaeche();
        this.malflaeche = malflaeche;
        // Hilft nichts    
        malflaeche.setBackground(Color.GREEN);
        setLayout(gbl);
        addiereKomponente(gbl, buttonHilfe, 0, 0, 1, 1, 2, 0);
        addiereKomponente(gbl, malflaeche, 0, 1, 3, 1, 1, 1);
    }

    public void addiereKomponente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbl.setConstraints(c, gbc);
        add(c);
    }

    public Malflaeche getMalflaeche() {
        return malflaeche;
    }
}

class Malflaeche extends JPanel {
    private Image image;

    public Malflaeche() {
    }

    public void maleInsBild() {
        Graphics graphics = null;
        int sx, sy;

        sx = this.getSize().width;
        sy = this.getSize().height;
        image = createImage(sx, sy);
        graphics = image.getGraphics();
        System.out.println("sx=" + sx + "sy=" + sy);
        // Hilft nichts
        setBackground(Color.GREEN);
        // Hilft nichts    
        repaint();
        graphics.setColor(Color.RED);
        graphics.drawLine(30, 40, 300, 400);
        graphics.drawLine(400, 300, 30, 40);
    }

    public void paintComponent(Graphics g) {
        // Hilft nichts    
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}
 

httpdigest

Top Contributor
In der Klasse Malflaeche erzeugst du ja auch in maleInsBild() ein Image mit der Größe der Malfläche und zeichnest es in paintComponent() mit `g.drawImage(image, 0, 0, null);`. Das überdeckt dann natürlich den kompletten Hintergrund. Kommentiere `g.drawImage(image, 0, 0, null);` aus und du siehst grün.
 

ernst

Top Contributor
In der Klasse Malflaeche erzeugst du ja auch in maleInsBild() ein Image mit der Größe der Malfläche und zeichnest es in paintComponent() mit `g.drawImage(image, 0, 0, null);`. Das überdeckt dann natürlich den kompletten Hintergrund. Kommentiere `g.drawImage(image, 0, 0, null);` aus und du siehst grün.

Erst mal vielen Dank für die Antwort.
1)
welches setBackground(Color.GREEN) ist nun nötig ?
Kannst du mir die Zeile genau nennen bzw. die Anweisung?
Ich habe ja viele probiert.
welche kann ich weglassen?

2)
was macht
g.drawImage(image, 0, 0, null);
genau ?
Warum überdeckt es den kompletten Hintergrund ?

3)
Braucht man
super.paintComponent(g);
bzw. was macht diese Anweisung ?

4)
Leider werden meine 2 Geraden nicht mahr angezeigt.
Was muss ich machen, damit diese wieder auf dem Bildschirm erscheinen ?

mfg
ern
 

mihe7

Top Contributor
welche kann ich weglassen?
Ich würde alle außer malflaeche.setBackground(Color.GREEN) entfernen, damit man die Hintergrundfarbe "von außen" einstellen kann.

Was ist so schwer daran, nur eine Hintergrundfarbe zu ändern ?
Nichts. Du musst es nur machen.

Hintergrund ist nur eine Illusion. Stell Dir einfach eine Leinwand vor. Dort gibt es keinen Hintergrund und keinen Vordergrund; das Ding ist eine Ebene und damit flach.

Um den Eindruck entstehen zu lassen, es gäbe etwas wie Hintergrund, zeichnet man die Komponente von "hinten" nach "vorne". D. h. man pinselt erst mal die Hintergrundfarbe auf die Leinwand und erst dann die Elemente, die sich weiter im Vordergrund befinden sollen.

Die Methode setBackground sorgt in erster Linie nur dafür, dass sich die Komponente die angegebene Farbe merkt. Erst beim Zeichnen wird dann der richtige Pinsel in die betreffende Farbe getunkt, um den Hintergrund auf die Leinwand zu bringen. D. h. paintComponent beginnt damit, erstmal ein Rechteck mit der zuvor gemerkten Hintergrundfarbe zu füllen. Schon hat man einen "Hintergrund". Danach werden andere Elemente gemalt.

Bei Dir ist im "Vordergrund" ein Bild image, das mit g.drawImage(image, 0, 0, null) an den Koordinaten 0, 0 gezeichnet wird. Da das Bild so groß wie die Komponente selbst ist, wird es den ggf. zuvor gepinselten Hintergrund überdecken.

Du brauchst also in paintComponent gar nicht erst den Hintergrund zu malen. Daher kannst Du Dir auch super.paintComponent sparen, denn damit würde die Implementierung von paintComponent in der Elternklasse (hier JPanel) aufgerufen. Egal, was dort passiert: Du würdest es gleich im Anschluss durch Dein Bild ersetzen.

Was Du machen musst, ist den Hintergrund in Deinem Bild zu zeichnen. Konkret könnte das so aussehen:

Java:
    public void maleInsBild() {
        int sx = getSize().width;
        int sy = getSize().height;
        image = createImage(sx, sy);
        Graphics graphics = image.getGraphics();
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, sx, sy);
        graphics.setColor(Color.RED);
        graphics.drawLine(30, 40, 300, 400);
        graphics.drawLine(400, 300, 30, 40);
        graphics.dispose(); // Ressourcen freigeben
        repaint(); // die Komponente neu zeichnen
    }
 

ernst

Top Contributor
Hintergrund ist nur eine Illusion. Stell Dir einfach eine Leinwand vor. Dort gibt es keinen Hintergrund und keinen Vordergrund; das Ding ist eine Ebene und damit flach.
....
Hallo mihe7,
vielen, vielen herzlichen Dank für deine tolle Erklärung und deine wertvolle Hilfe.
So gut erklärt habe ich es nie im Internet gefunden.
Jetzt klappt alles.

mfg
ern
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Swing Hintergrundfarbe von Submenüeinträgen setzen AWT, Swing, JavaFX & SWT 2
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
E JavaFX SplitMenuButton Hintergrundfarbe AWT, Swing, JavaFX & SWT 1
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
D Hintergrundfarbe AWT, Swing, JavaFX & SWT 6
C JavaFx TabelView - hintergrundfarbe möglich? AWT, Swing, JavaFX & SWT 1
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
M JavaFX MenuItem Hintergrundfarbe in CSS AWT, Swing, JavaFX & SWT 4
A JButtons - es wird beim falschen Button die Hintergrundfarbe angepasst AWT, Swing, JavaFX & SWT 2
M JComboBox Hintergrundfarbe des gewählten Items AWT, Swing, JavaFX & SWT 3
S Swing Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 9
R Swing Hintergrundfarbe der Zelle in einer JTable bei Markierung AWT, Swing, JavaFX & SWT 2
K Hintergrundfarbe des Frames ändern AWT, Swing, JavaFX & SWT 4
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
W Swing Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 4
S JTable Hintergrundfarbe AWT, Swing, JavaFX & SWT 5
M Hover-Farbe über Hintergrundfarbe legen AWT, Swing, JavaFX & SWT 3
B Hintergrundfarbe der JComboBox AWT, Swing, JavaFX & SWT 3
Shanks Hintergrundfarbe durch Button click ändern ?? AWT, Swing, JavaFX & SWT 6
A Hintergrundfarbe eines Applets ändern AWT, Swing, JavaFX & SWT 2
Psypsy Swing Jpanel Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 10
E Hintergrundfarbe wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S Hintergrundfarbe in JToolbar nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Hintergrundfarbe von CheckBoxen in einer JTable AWT, Swing, JavaFX & SWT 4
E Swing JComboBox Hintergrundfarbe AWT, Swing, JavaFX & SWT 6
R Hintergrundfarbe vom Fenster AWT, Swing, JavaFX & SWT 2
M Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 5
M AWT Hintergrundfarbe zuweisen AWT, Swing, JavaFX & SWT 6
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
calzone JTable und Hintergrundfarbe AWT, Swing, JavaFX & SWT 12
G Hintergrundfarbe eines JPanels zurücksetzen AWT, Swing, JavaFX & SWT 12
G JToggleButton - Hintergrundfarbe beim Drücken festlegen AWT, Swing, JavaFX & SWT 4
S Hintergrundfarbe in einer Spalte der JTable verändern AWT, Swing, JavaFX & SWT 3
G JTextArea - Hintergrundfarbe? AWT, Swing, JavaFX & SWT 5
hdi Hintergrundfarbe von Label AWT, Swing, JavaFX & SWT 2
T Warum nehmen diese Labels die Hintergrundfarbe nicht an? AWT, Swing, JavaFX & SWT 6
D Browser -> Hintergrundfarbe AWT, Swing, JavaFX & SWT 11
T jtree Hintergrundfarbe für ganze Zeile AWT, Swing, JavaFX & SWT 2
S Hintergrundfarbe eines JFrames ändern AWT, Swing, JavaFX & SWT 2
C Hintergrundfarbe von einem disabled Button ändern ? AWT, Swing, JavaFX & SWT 7
R JTable Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 7
foobar Hintergrundfarbe eines JMenus ändern AWT, Swing, JavaFX & SWT 2
O Hintergrundfarbe beim ToolTip AWT, Swing, JavaFX & SWT 5
J [Newbie] Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
J JTabbedPane Hintergrundfarbe Problem AWT, Swing, JavaFX & SWT 8
S Hintergrundfarbe für JFrame AWT, Swing, JavaFX & SWT 6
I Hintergrundfarbe beim JLabel AWT, Swing, JavaFX & SWT 3
G JList: Hintergrundfarbe eines Eintrags AWT, Swing, JavaFX & SWT 5
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
S TableCellRender - Zelle auf editier-/anklickbar setzen AWT, Swing, JavaFX & SWT 5
berserkerdq2 Anchorpane warum kann ich nicht Anchors setzen AWT, Swing, JavaFX & SWT 6
_user_q ThreadPool schedule Wert auf false setzen AWT, Swing, JavaFX & SWT 1
E verschiedene Cursor setzen AWT, Swing, JavaFX & SWT 1
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
G Button Strings Effektiver setzen AWT, Swing, JavaFX & SWT 3
W Bounds setzen AWT, Swing, JavaFX & SWT 1
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
L JavaFX TableColumns mit CellFactory setzen AWT, Swing, JavaFX & SWT 9
J Standardwert in Choicebox setzen ? AWT, Swing, JavaFX & SWT 0
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
T Setzen von der Schriftgröße bei einem Shell AWT, Swing, JavaFX & SWT 15
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
K Swing DefaultListModel braucht zu lange, um Wert zu setzen AWT, Swing, JavaFX & SWT 7
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
S JButtons an Koordinaten setzen AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
wolfgang63 JavaFX von controllerclass primarystage Titel setzen AWT, Swing, JavaFX & SWT 4
F Setzen des LookAndFeel AWT, Swing, JavaFX & SWT 4
M Swing Shapes setzen AWT, Swing, JavaFX & SWT 4
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
W JTextfield - Wert lässt sich nicht setzen AWT, Swing, JavaFX & SWT 3
H JavaFX GridPane: Zellenfarbe setzen AWT, Swing, JavaFX & SWT 9
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Tooltip Dauer setzen AWT, Swing, JavaFX & SWT 0
A JTable schreibschutz setzen bzw. aufheben AWT, Swing, JavaFX & SWT 2
TheWhiteShadow SWT Dialog Titel setzen AWT, Swing, JavaFX & SWT 6
R SWT TreeViewer neuen Input setzen AWT, Swing, JavaFX & SWT 3
Kenan89 Java FX ScrollPane Content mittig setzen AWT, Swing, JavaFX & SWT 5
B Swing Fokus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
P jTable model setzen AWT, Swing, JavaFX & SWT 6
J Swing JInternalFrame modal setzen? AWT, Swing, JavaFX & SWT 13
J Swing JMenuItem auf setEnabled(false) setzen? AWT, Swing, JavaFX & SWT 3
S Swing Setzen von TableModel liefert NullPointer AWT, Swing, JavaFX & SWT 6
I LookAndFeel setzen AWT, Swing, JavaFX & SWT 17

Ähnliche Java Themen

Neue Themen


Oben