Swing Farbige JPanels auf JFrame werden nicht gezeigt. Was mach ich falsch?

Wiesel

Mitglied
Hallo

Ich möchte "selbstgemachte" farbige JPanels auf JFrames bringen, aber sie werden nicht angezeigt...

Hier die JPanels:
Java:
import javax.swing.*;
import java.awt.*;

@SuppressWarnings("serial")
public class RGBField extends JPanel
{
    int x;
    int y;
    int height;
    int width;
    Color color;
 
    RGBField( int x, int y, int height, int width, Color color )
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.color = color;
    }
    
    @Override
    protected void paintComponent( Graphics g )
    {
        super.paintComponent( g );
        
        g.setColor( this.color );
        g.fillRect( x, y, width, height );
        g.setColor( Color.black );
        g.drawRect( x, y, width, height );
    }
    
}

Hier die aufrufende Klasse:
Java:
import java.awt.Color;
import javax.swing.JFrame;

public class Test 
{
    public static void main( String[] args )
    {
        Color redColor = new Color( 220, 230, 0 );
        Color blueColor = Color.blue;
        RGBField red = new RGBField( 10, 10, 100, 100, redColor );
        RGBField blue = new RGBField( 120, 10, 100, 100, blueColor );
        
        JFrame frame = new JFrame( "Test" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setSize( 500, 500);
        frame.add( red );
        frame.add( blue );
        frame.setVisible( true );
        
        System.out.println( redColor.getBlue() );
        
    }

}
 
Du hast bei deinem Frame kein Layout gesetzt. Somit wird als Default das BorderLayout verwendet. Wenn du nun beide Panels ohne Constraint zum Frame hinzufügst, wird das zweite Panel einfach über dem ersten platziert. Somit ist das erste nicht mehr sichtbar.

Und wenn du Komponenten zu einem Frame hinzufügen willst. bitte mit JFrame.getContentPane().add(...)
 
So?

Java:
import java.awt.*;
import javax.swing.*;

public class Test 
{
	public static void main( String[] args )
	{
		RGBField red = new RGBField( 10, 10, 100, 100, Color.red );
		RGBField blue = new RGBField( 120, 10, 100, 100, Color.blue );
		
		JFrame frame = new JFrame( "Test" );
		Container con = new Container();
		LayoutManager group = new GroupLayout( con );
		
		frame.setContentPane( con );
		frame.getContentPane().setLayout( group );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setSize( 500, 500);
		frame.setVisible( true );
		
	    frame.getContentPane().add( red );
		frame.getContentPane().add( blue );	
	}

}

Das geht auch nicht...
 
Ne das geht so nicht. Du musst dich erstmal richtig mit den Layoutmanagern auseinandersetzen und verstehen wie die fuktionieren.
Um dir mal einen Start zu geben, bleibe einfach mal beim BorderLayout. Da hast du die 5 Bereiche North,South,Center, East,West. Du musst jetzt deine Panel diesen Bereichen zuordnen.
Java:
frame.add(red, BorderLayout.EAST);
frame.add(blue, BorderLayout.WEST);
Damit setzt du das red panel in den EAST Bereich und das blue in den WEST Bereich des ContentPanes.
Je nachdem wie und wo du die Panels anordnen willst, musst du halt entscheiden welchen LayoutManager du brauchst.
Die setvisible Methode solltest du zudem immer als letztes aufrufen.

Und
bitte mit JFrame.getContentPane().add(...)
brauchst du schon seit Java 5 nicht mehr. frame.add() ist völlig audreichend und führt im Hintergrund die gleiche Methode aus.
 
Zuletzt bearbeitet:
OK, habe es jetzt so, aber es geht immer noch nicht:
Java:
package de.stdsoft.rbgmixer;

import java.awt.*;
import javax.swing.*;

public class Test 
{
	public static void main( String[] args )
	{
		RGBField red = new RGBField( 10, 10, 100, 100, Color.red );
		RGBField blue = new RGBField( 120, 10, 100, 100, Color.blue );
		
		JFrame frame = new JFrame( "Test" );
		LayoutManager layout = new BorderLayout();
	
		frame.setLayout( layout );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setSize( 500, 500);
	    frame.add( red, BorderLayout.EAST );
		frame.add( blue, BorderLayout.WEST );	
		frame.setVisible( true );
	}

}
 
Solange beim BorderLayout genügend Platz vorhanden ist um alle Komponenten darzustellen, wird die Breite bzw. Höhe der Randkomponenten von der Preferred Size der jeweiligen Komponente bestimmt. Die CENTER Komponente bekommt den restlichen zur Verfügung stehenden Platz.

Da deine Panels leer sind, ist die Preferred Size deiner Panels 10 x 10 Pixel. Da du aber erst ab x=10 bzw x=120 die Rechtecke zeichnest, werden diese außerhalb des Panels gezeichnet (also nicht sichtbar).

Eine Lösung wäre im Konstruktor von RGBField setPreferredSize aufzurufen oder ein anderes Layout zu verwenden.

Als Layout Neuling kann es übrigens beim Testen manchmal hilfreich sein bei den Komponenten einen Rand zu setzen. So sieht man genau welche Komponente wie groß ist:
Java:
    RGBField( int x, int y, int height, int width, Color color ) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.color = color;
        setPreferredSize( new Dimension( width + x, height + y ) );
        setBorder( javax.swing.BorderFactory.createLineBorder( Color.BLACK ) ); // Zu Testzwecken
    }
 
Zuletzt bearbeitet:
Hallo

Ich habe das Problem einfach gelöst indem ich mit Netbeans eine neue Grafische Oberfläche mit GroupLayout zusammengeklickt ( mehrere hundert Zeilen Code )und statt den selbstgemachten ein einfaches JPanel eingesetzt und dann mit

Java:
panel.setBackground( Color.red )

ein rotes JPanel bekommen...
 
Tja. warum einfach, wenns auch kompliziert geht?
Weiter oben wurde schon darauf hingewiesen, daß deine farbigen Flächen auuserhalb des Anzeigebereiches des JPanels liegen und deshalb nicht gezeichnet werden.
Ich wette, wenn du anstatt mehrere hundert Zeilen Code zu schreiben, im Konstruktor deiner RGBField Klasse sowas wie setPreferredSize(new Dimension(width + 2*x, height + 2*y)) schreibst, du dann was sehen würdest. Zumindest wenn die x,y Werte so etwas wie eine freizulassende Umrahmung darstellen.
 

Zurück
Oben