Welcher Methodenaufruf bei Hover, click,...

dereki2000

Mitglied
Hallo,
Wenn z. B. auf einen JButton geklickt wird oder die Maus drüber bewegt wird, ändert sich ja die Grafik, welche Methode wird da aufgerufen? Ist das bei Jcomponent genauso?
Ich habe schon die Methode doClick() in AbstractButton() gefunden, wo paintImmediately() aufgerufen wird. Dann hab ich im Konstruktor meines Buttons einen Mouse listener hinzugefügt und genau diese Methode bei mousePresses() aufgerufen. Hat leider nicht funktioniert

Mein Ziel ist ein eigener Button, der von Jcomponent erbt.
 
Zuletzt bearbeitet:
Was willst Du denn genau haben?

Nachtrag: damit meine ich, was Du als Ergebnis haben willst. Warum willst Du einen eigenen Button implementieren?
Ich finde Swing halt ziemlich hässlich 😀. Und mir macht es Spaß Dinge selber zu schreiben bzw. auszuprobieren. Dadurch lerne ich halt auch Dinge dazu. Ich hätte hier auch mal meinen aktuellen Quellcode.
Java:
public class TabButton extends JComponent
   {
       private boolean drawDecoration = true;
       private String label;
       public TabButton(String label)
       {
           this.label = label;
           this.addMouseListener(new MouseAdapter() {
               public void mousePressed(MouseEvent e) {
                   pressed();
               }

               @Override
               public void mouseReleased(MouseEvent e) {
                   released();
               }
           });
          
       }
      
       public boolean isDrawDecoration() {
           return drawDecoration;
       }
      
       public void setDrawDecoration(boolean drawDecoration) {
           this.drawDecoration = drawDecoration;
       }

       public String getLabel() {
           return label;
       }

       public void setLabel(String label) {
           this.label = label;
       }

       protected void paintComponent(Graphics g)
       {
          
           Color mainColor;
           if(isEnabled())
               mainColor = new Color(0,255,255);
           else
               mainColor = Color.LIGHT_GRAY;
           Graphics2D g2 = (Graphics2D)g;
           int w = getWidth();
           int h = getHeight();
           g2.setColor(mainColor);
           int[] xPointsI = {6,   w-12-w/10 ,   w-12,        w-12,   w/10+6,     6};
           int[] yPointsI = {6,   6,           h/10+6,       h-12,   h-12,    h-12-h/10};
           g2.drawPolygon(new Polygon(xPointsI, yPointsI, 6));
           if(drawDecoration)
               g2.drawString("TestButton DerexUI", 10, 20);
           g2.setFont(new Font("Arial",Font.PLAIN, (w<h)?w/2:h/2));
           FontMetrics fm = g.getFontMetrics();
           Rectangle2D b = fm.getStringBounds(label, g2);
           g2.drawString(label, (int)(w-20-b.getWidth()), h-20);
       }
      
       public void pressed()
       {
           System.out.println("pressed");
           paintImmediately(new Rectangle(0,0, getWidth(), getHeight()));
       }
      
       public void released()
       {
           System.out.println("released");
           //kommt noch wenn pressed() funktioniert
       }
   }

Ich hoffe das ist einigermaßen verständlich, das ist bei mir immer sehr schwer.

EDIT: Und ich möchte mein Interface mit einem eigenen Design ausstatten.
 
Das sind verschiedene Dinge. Komponenten selber schreiben, um auszuprobieren und was dazu zu lernen auf der einen, Swing umstylen auf der anderen Seite.

Zu letzterem: Swing verwendet einen Plugin-Mechanismus für das Look & Feel. Du kannst entweder fertige nehmen, die Dir gefallen oder selbst welche schreiben bzw. umgestalten, s. dazu https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/index.html

Jetzt zu Deinem Code und damit zum Schreiben von Komponenten: Deine pressed()-Methode zeichnet aktuell nur der Button neu, womit der aktuelle Zustand des Buttons am Bildschirm angezeigt wird. Damit Du eine Änderung feststellen kannst, musst Du den Zustand des Buttons auch ändern 🙂

Zum Beispiel ein boolean pressed einführen, das auf true setzen und in paintComponent entsprechend reagieren.
 
Jetzt zu Deinem Code und damit zum Schreiben von Komponenten: Deine pressed()-Methode zeichnet aktuell nur der Button neu, womit der aktuelle Zustand des Buttons am Bildschirm angezeigt wird. Damit Du eine Änderung feststellen kannst, musst Du den Zustand des Buttons auch ändern 🙂

Zum Beispiel ein boolean pressed einführen, das auf true setzen und in paintComponent entsprechend reagieren.

Das bedeutet, dass jedes Mal wenn ich paintImmediately() aufrufe, wird paintComponent() aufgerufen?

EDIT: Habe jetzt einfach repaint() aufgerufen. Funktioniert super 🙂
 
Das bedeutet, dass jedes Mal wenn ich paintImmediately() aufrufe, wird paintComponent() aufgerufen?
Ja, indirekt. Tatsächlich wird paint() aufgerufen, das unter anderem paintComponent() aufruft.

repaint() legt ein "Neuzeichnen-Ereignis" in eine Warteschlange, die vom Event Dispatch-Thread abgearbeitet wird, paintImmediately() führt paint() praktisch sofort aus.
 

Zurück
Oben