JPanel Problem

Hi!

Also ich habe das Problem, dass wenn ich ein JPanel habe und auf diesem ein JLabel adde oder jegliche andere Swing-Komponenten(wie Textfelder etc) und nun danach auf das Panel ein neues JPanel lege dann scheint die Schrift des
Labels durch das zweite Panel. Habe es schon mit setOpaque versucht geht leider nicht? Wie kann ich es also unterbinden das die Komponenten durchscheinen?!
Es soll so eine Art Popup-Panel sein. Das unterliegende Panel soll an den Seite durchsichtig sein nur nicht in der Mitte wo ich z.B. mit paintCompont ein gefülltes Rechteck zeichne.

Es gibt ja scjon JPopupMenu, kannst du nicht das fuer dein Programm verwenden?

Pfff, kann am LayoutManager liegen, ich hab wirklich keine Ahnung gerade…

Zeig doch mal dein code bitte

ohne code kann man dir grad nicht helfen…

Hier ein kleines Test-Beispiel. Ja ich weiß, dass einige sich über das null-Layout aufregen werden und es abraten werden :smiley: , aber nehmt es einfach so hin!
Also wie kann man diesen Code verändern, so dass die Komponenten nur an den Stellen wo mit paintComponent drüber gezeichnet wurde, nicht mehr zu sehen sind…
Das TextFeld sollte man danach aber zu Hälfte sehen können, also dort wo nicht mit paintComponent drüber gemalt wurde.

Java Code:

[ol]
[li]import java.awt.Color;[/li][li]import java.awt.Font;[/li][li]import java.awt.Graphics;[/li][li]import java.awt.event.KeyAdapter;[/li][li]import java.awt.event.KeyEvent;[/li][li]import java.awt.event.MouseEvent;[/li][li]import java.util.ArrayList;[/li][li]import javax.swing.JFrame;[/li][li]import javax.swing.JLabel;[/li][li]import javax.swing.JPanel;[/li][li]import javax.swing.JTextField;[/li][li]public class Fenster {[/li][li] private JFrame fenster;[/li][li] public Fenster() {[/li][li] fenster = new JFrame();[/li][li] fenster.setSize(1200, 800);[/li][li] fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);[/li][li] fenster.setUndecorated(true);[/li][li] fenster.getContentPane().setBackground(new Color(41, 57, 85));[/li][li] fenster.setLocationRelativeTo(null);[/li][li] final PanelOne one = new PanelOne();[/li][li] one.setBounds(0, 0, 1200, 800);[/li][li] fenster.add(one);[/li][li] fenster.setVisible(true);[/li][li] }[/li][li] private class PanelOne extends Bottom {[/li][li] private JTextField field;[/li][li] private JLabel label;[/li][li] public PanelOne() {[/li][li] field = new JTextField();[/li][li] field.setHorizontalAlignment(JTextField.CENTER);[/li][li] field.setForeground(Color.DARK_GRAY);[/li][li] field.setBounds(760, 400, 140, 23);[/li][li] add(field);[/li][li] label = new JLabel(„Text scheint durch“);[/li][li] label.setForeground(Color.WHITE);[/li][li] label.setBounds(500, 450, 140, 23);[/li][li] add(label);[/li][/ol]

[ol]
[li] PanelTwo two = new PanelTwo();[/li][li] two.setBounds(0, 0, 1200, 800);[/li][li] add(two);[/li][li] }[/li][li] }[/li][li] private class PanelTwo extends Bottom {[/li][li] public void paintComponent(Graphics g) {[/li][li] g.setColor(Color.GRAY);[/li][li] g.fillRect(350, 200, 500, 500);[/li][li] }[/li][li] }[/li][li] private abstract class Bottom extends JPanel {[/li][li] public Bottom() {[/li][li] super();[/li][li] setLayout(null);[/li][li] setBounds(0, 0, 1200, 800);[/li][li] setOpaque(false);[/li][li] }[/li][li] }[/li][li] public static void main(String[] args) {[/li][li] new Fenster();[/li][li] }[/li][li]}[/li][/ol]

In der paintCopoment() mussvin die erste zeile:

super.paintComponent(g);

*** Edit ***

Und wenn du sowieso nur ein rect malst reicht auch ein setBackground aber ich geh mal davon aus das es nur beim test so ist…

*** Edit ***

Und ausserdem: erst alle komponente hinzufuegen und dann framevisible machen

und

pack();

fehlt auch noch vor setVisible()

Was du noch machen kannst ist bei paintComponent anstatt public protected zu nehmen

Pack muss nicht unbedingt sein.

super.paintComponent(g);
bringt nichts sehe keine Auswirkungen

pack() ist sowieso sinnlos ist ja auch null layout

und das Problem ist geblieben. Hat jemand noch eine Idee wie man das lösen kann?

        private JTextField field;
        private JLabel label;

        public PanelOne() {
            field = new JTextField();
            field.setHorizontalAlignment(JTextField.CENTER);
            field.setForeground(Color.DARK_GRAY);
            field.setBounds(760, 400, 140, 23);
            
            label = new JLabel("Text scheint durch");
            label.setForeground(Color.WHITE);
            label.setBounds(500, 450, 140, 23);

            PanelTwo two = new PanelTwo();
            two.setBounds(0, 0, 1200, 800);
            
            add(label);
            add(two);
            add(field);
        }
        
        @Override
        public boolean isOptimizedDrawingEnabled() {
            return false;
        }
    }```
Änderungen: Reihenfolge der add-Aufrufe und isOptimizedDrawingEnabled überschrieben.

Ich probiers mal aus wenn ich zuhause bin.

Nachtrag:
Wenn das Label auch noch verdeckt werden soll, dann eben an anderer Stelle adden oder z order explizit setzen. Vielleicht interssant: JLayeredPane.

Ich rate mal: Du willst einen Text haben, der über einem Farbigen Rechteck erscheint.



public class JavaNones extends JFrame {

	private JLayeredPane contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JavaNones frame = new JavaNones();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public JavaNones() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JLayeredPane();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBackground(Color.RED);
		panel.setBounds(152, 0, 157, 136);
		contentPane.add(panel,JLayeredPane.DEFAULT_LAYER);
		
		JLabel lblTextScheintDurch = new JLabel("Text scheint durch");
		lblTextScheintDurch.setBounds(180, 10, 89, 14);
		contentPane.add(lblTextScheintDurch,JLayeredPane.POPUP_LAYER);
	}

}

Beim meinem Anwendungsbeispiel klappt es danke :slight_smile:

Also die Methode von papoy

Also die Methode von papoy

*** Edit ***

Also die Methode von papoy

*** Edit ***
@bERt0r

Nein ich wollte das der Text auf dem anderen JPanel nicht durchscheint. Hat sich jetzt aber geklärt

Waere nett wenn du deine loesung fuer andere auch mitteioen koenntest.

Du glaubst nicht wie viele leute am tag soetwas googeln…