JButton nicht sichtbar, aber funktionsfähig

Joker4632

Mitglied
Hallo,
Zuerst, ja ich hab gegoogelt, aber nein ich habe nicht genau das gefunden was ich gesucht habe.
Ich möchte eigentlich nur einen Button auf ein TitlePanel (extends JPanel, nullLayout), bei dem ich die Paint Methode überschrieben und nen MouseListner hinzugefügt habe, legen. Der Button selbst ist unverändert, nur setBounds() und ein ActionListner ist gesetzt. Dem titlePanel wurde er natürlich hinzugefügt.
Klicke ich an die Stelle wo er sein sollte wird auch der ActionListner des Button ausgelöst, er ist also da wo er sein sollte nur sehe ich ihn nicht.
Hab auch schon repaint() von Button & TitlePanel ausprobiert.. nichts.

Kann es sein, dass der Button von der paint Methoden überschrieben wird?

Hier das TitlePanel:
Java:
package fractalator.main.surface.components;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

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

public class TitlePanel extends JPanel {
   
    JFrame Frame;
    Point point;
    String title;

    public TitlePanel(String title, JFrame frame) {
        this.title = title;
        this.Frame = frame;
       
        this.setSize(frame.getWidth(), 50);
       
        point = Frame.getLocation();

         addMouseListener(new MouseAdapter() { 
             public void mousePressed(MouseEvent e) { 
                 if(!e.isMetaDown()){ 
                 point.x = e.getX(); 
                 point.y = e.getY(); 
                 } 
             } 
         }); 
         addMouseMotionListener(new MouseMotionAdapter() { 
             public void mouseDragged(MouseEvent e) { 
                 if(!e.isMetaDown()){ 
                 Point p = Frame.getLocation(); 
                 Frame.setLocation(p.x + e.getX() - point.x,  p.y + e.getY() - point.y); 
                 } 
             }
         });
    }
   
    @Override
    public void paint(Graphics g) {
   
        //TitleBar
        g.setColor(new Color(64,64,64));
        g.fillRect(0, 0, this.getWidth(), 50);
        g.setColor(new Color(255,255,255));
        g.setFont(new Font("Calibri",0,26));
        g.drawString(title, 20, 35);
        repaint();
    }

}

P.S.: Das Null-layout wird noch abgeändert, sollte aber eigentlich nicht das Problem sein.
 
Falls es wichtig sein sollte hier noch der Ausschnitt aus der JFrame Klasse:
Java:
TitlePanel = new TitlePanel("Userinterface", this);
        TitlePanel.setLocation(0, 0);
        TitlePanel.setLayout(null);
        BasePanel.add(TitlePanel);
       
button_close = new JButton("Bla");//(new ImageIcon("./src/IncludedGraphics/closebutton_icon.png"));
       button_close.addActionListener(new ActionListener() {
           
           @Override
           public void actionPerformed(ActionEvent e) {
               System.out.println("Something");
               
           }
       });
       button_close.setBounds(this.getWidth()-40, 10, 30, 30);
       //button_close.setFocusable(false);
       //button_close.setMargin(new Insets(0, 0, 0, 0));
       //button_close.setContentAreaFilled(false);
       //button_close.setBorderPainted(false);
       TitlePanel.add(button_close);
Das BasePanel ist eigentlich nutzlos aktuell, dient aber als Grundlage für mein JFrame.
 
Versuch in deiner paint() Methode mal in der ersten Zeile super.paint(g); aufzurufen.
Grund dafür findest du in der API.

Generelle Anmerkungen:
- Halte dich an die Namenskonventionen.
Klassennamen - UpperCammelCase
Konstanten UPPER_CASE
Der Rest in lowerCammelCase

Das macht es für andere leichter den Code zu lesen 🙂

Gruß Robert
 
Stimmt die habe ich vergessen, funktioniert leider trotzdem nicht 🙁
Auch Graphics2D habe ich schon probiert... Falls es weiter hilft, sobald ich die Paint() Methode auskommentiere wird der button angezeigt.
Und ja, ich hab mir das Anfangs dummerweise angewöhnt... ich ändere es mal ab, Danke 😕
 
Zuletzt bearbeitet:
Ok, ich hab es!
Ich schätze der Tipp mit super.paint(g) war nicht so verkehrt. Nur scheint mein repaint() am Ende auch wieder den Button übermal zu haben oder evtl. eine Loop erzeugt haben? Weiß nicht wie das abläuft.
Ohne repaint() gehts aber. Danke.
 
Gibt es eigentlich Gründe, dass du paint() überschreibst und nicht paintComponent() ?

repaint() sollte man ohnehin nicht in einer paint() / paintComponent() Methode aufrufen 😛
 

Zurück
Oben