Swing JPanel auf gezeichnete Fläche legen

knoppers

Bekanntes Mitglied
Ich habe eine Komponente in Swing gezeichnet, und möchte jetzt auf die gezeichnete Komponente ein Panel legen. Hab es versucht einfach mit add(kom...). Dies geht leider aber nicht. Was mache ich hier verkehrt?

Java:
public class JavaSwingDrawDemo extends JFrame {

	public JavaSwingDrawDemo() {

		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationByPlatform(true);
		setVisible(true);

		JComponent centerPanel = createCenterPanel();

		JPanel centerPanel1 = new JPanel();
		centerPanel1.setBackground(Color.RED);
		
		centerPanel.add(centerPanel1, BorderLayout.CENTER);
		centerPanel.setComponentZOrder(centerPanel1, 0);
		centerPanel.repaint();

		BorderLayout layout = new BorderLayout();
		getContentPane().setLayout(layout);
		getContentPane().add(centerPanel, BorderLayout.CENTER);

	}

	private JComponent createCenterPanel() {
		JComponent panel1 = new JComponent() {

			@Override
			public void paint(Graphics g) {
				super.paint(g);

				final Graphics2D g2 = (Graphics2D) g.create();

				// draw the content
				g2.setColor(Color.WHITE);

				final int parrCompX = 20;
				final int parrCompY = 20;

				final int parrentInnerDistance = 20;

				final Dimension parrentDim = getContentPane().getSize();

				final int roundCornerSize = 15;

				final int width = parrentDim.width - (parrentInnerDistance * 2);
				final int height = parrentDim.height - (parrentInnerDistance * 2);

				g2.fillRoundRect(parrCompX, parrCompY, width, height, roundCornerSize, roundCornerSize);

				// draw the border
				g2.setStroke(new BasicStroke(3f));
				g2.setColor(Color.BLACK);
				g2.drawRoundRect(parrCompX, parrCompY, width, height, roundCornerSize, roundCornerSize);

				g2.dispose();
			}

		};
		return panel1;
	}

	public static void main(String[] args) {
		new JavaSwingDrawDemo();
	}

}
 
Okay, es war mal wieder das Problem mit setPrefferedSize der Komponente die ich auf die gezeichnete Komponente lege. Aber es legt mir jetzt nach wie vor die Komponente in den Hintergrund. Ich will aber diese auf das gezeichnete Panel legen und nicht dahinter.
 
Zuletzt bearbeitet:
Alles eine Frage des LayoutManagers ;-)
Ansonsten
- setVisible(true) auf dem Frame erst aufrufen nachdem alle Komponenten eingefügt wurden.
- bei Swing Komponenten überschreibt man paintComponent - nicht paint
- der Zugriff auf den ContentPane des Frames innerhalb der paint... ist nicht gerade schön

Hier mal funktionierender Code:
Java:
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class JavaSwingDrawDemo extends JFrame {
	 
    public JavaSwingDrawDemo() {
 
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
 
        JComponent centerPanel = createCenterPanel();
        centerPanel.setLayout(new FlowLayout());
 
        JPanel centerPanel1 = new JPanel();
        centerPanel1.setBackground(Color.RED);
        centerPanel1.setPreferredSize(new Dimension(100, 100));
        
        centerPanel.add(centerPanel1);
 
        BorderLayout layout = new BorderLayout();
        getContentPane().setLayout(layout);
        getContentPane().add(centerPanel, BorderLayout.CENTER);
        setVisible(true);
    }
 
    private JComponent createCenterPanel() {
        JComponent panel1 = new JComponent() {
            public void paintComponent(Graphics g) {
            	super.paintComponent(g);
                final Graphics2D g2 = (Graphics2D) g.create();
                // draw the content
                g2.setColor(Color.WHITE);
 
                final int parrCompX = 20;
                final int parrCompY = 20;
 
                final int parrentInnerDistance = 20;
                final int roundCornerSize = 15;
 
                final int width = this.getWidth() - (parrentInnerDistance * 2);
                final int height = this.getHeight() - (parrentInnerDistance * 2);
 
                g2.fillRoundRect(parrCompX, parrCompY, width, height, roundCornerSize, roundCornerSize);
 
                // draw the border
                g2.setStroke(new BasicStroke(3f));
                g2.setColor(Color.BLACK);
                g2.drawRoundRect(parrCompX, parrCompY, width, height, roundCornerSize, roundCornerSize);
 
                g2.dispose();
            }
 
        };
        return panel1;
    }
 
    public static void main(String[] args) {
        new JavaSwingDrawDemo();
    }
}
 
Okay. Danke. Problem ist was ist wenn ich das BorderLayout für andere Komponenten brauche. Das mit dem ContentPane, da hast du natürlich vollkommen recht. Ist nicht gerade die schöne Art.
 

Neue Themen


Zurück
Oben