JTextField um JButton erweitern



  • Hi

    ich hab momentan ein TextField und neben drann immer einen Butten. Das ganze wird zur Datumseingabe verwendet. Einersets kann ich im Textfeld was eingeben, andererseits über den Button in einen Kalender gehen, und dort das Datum auswählen.

    Da ich auf einem Dialog meist mehrere Datumseingaben hab wollte ich die beiden componenten zusammenpacken. um nicht jedes mal die Componenten einzeln positionieren zu müssen und für jeden Butten einen Eventhandler zu schreiben/ anzupassen.

    Eine Lösung währe ja von JPanel abzuleiten und die Componenten daruf zu vereinen und passende zugriffsmetoden für das Textfeld bereitzustellen. Hat aber das Problem, das dann dieses "DateField" nicht mehr vom Typ JTextFeild währe. Was änderungen an anderen Systemen nachsich ziehen würde die ich gerne vermeiden würde.

    Den Button einfach in einen von JTextfield abgeleiteten classe add'en und hinter das Textfeld verschieben geht leider auch nicht, da dann der button nicht mehr gezeichnet wird.

    Gibt es eine möglichkeit ein JTextField um zusätzliche Componenten zu erweitern? und wie realisier ich das? (was muss ich verändern bzw überschreiben)

    gruss Termite



  • Ohne tiefgreifende Veränderungen am UI wird das nicht machbar sein. Da denke ich wäre es einfacher Schnittstellen zum JPanel anzubieten um wieder auf das TextFeld zu kommen. Normalerweise würde eine Methode á la 'getDateField()' ja ausreichen, oder?



  • Hi

    nicht ganz (weden ein paar mehr werden) aber so in der art

    naja werd wohl in den sauren apfel beissen müssen und das subsystem modifizieren.

    der Andere versuch von JTextField abzuleiten und ein JPanel drüberzulegen hat nicht ganz so fuktioniert wie ich mir das vorgestellt hab.

    😮 zeichnet der doch die componente zweimal

    gruss Termite



  • Hi

    hab ne lösung gefunden. (auf sowas muss ma erst mal kommen)
    ich verpass meinem Texfeld einen MatterBoder damit ich an der rechten seite platz hab um meinen butten darzustellen. ( sonst würd das textfeld drunter weitergehen und das will ich ja nicht. liks währs noch blöder da dann die ersten zeichen der eingabe verschwinden)

    Da aber mit dem MatterBorder der NormaleBorder verschwindet, muss man das ganze noch in ein CompoundBorder verpacken. Ausen den Matter innen den bisherigen ( den kann man sich ja vorher sichern )

    was dann noch angepasst werden muss ist set/getSize und set/getBounds sowie set/getBorder und schon haben wir rechts bzw links platz um z.B. einen Button (oder was auch immer) zu positionieren. der einzige nachteil ist, das der Button direckt am Textfeld stehen muss, da sonst eine hässliche lücke zwischen textfeld und button entsteht, die mit der hintergrundfarbe des buttons aufgefüllt wird.

    fals jemand weis wie man hintergrundtransparente MatterBorder macht kann es ja kurtz dazuschreiben.

    so kurtz mein code.

    public class ButtonTextField extends JTextField
    {
       private JButton button      = new JButton ( "..." );
    
       private Border  outerBorder = null;
    
       private Border  innerBorder = null;
    
       public DateField ()
       {
          super ();
    
          this.innerBorder = this.getBorder ();
    
          this.outerBorder = BorderFactory.createMatteBorder ( 0, 0, 0, 20, (Color) null );
    
          CompoundBorder border = new CompoundBorder ( this.outerBorder, this.innerBorder );
    
          this.setBorder ( border );
    
          this.add ( button, null );
       }
    
       public void setBounds ( int arg0, int arg1, int x, int y )
       {
          super.setBounds ( arg0, arg1, x, y );
          this.button.setBounds ( x - 20, 0, 20, y );
       }
    
       public void setBounds ( Rectangle r )
       {
          super.setBounds ( r );
          this.button.setBounds ( (int) r.getWidth () - 20, 0, 20, (int) r.getHeight () );
       }
    
       public void setSize ( Dimension d )
       {
          super.setSize ( d );
          this.button.setBounds ( (int) d.getWidth () - 20, 0, 20, (int) d.getHeight () );
       }
    
       public void setSize ( int x, int y )
       {
          super.setSize ( x, y );
          this.button.setBounds ( x - 20, 0, 20, y );
       }
    
       public Border getBorder ()
       {
          return this.innerBorder;
       }
    
       public void setBorder ( Border newBorder )
       {
          this.innerBorder = newBorder;
          CompoundBorder border = new CompoundBorder ( this.outerBorder, this.innerBorder );
    
          this.setBorder ( border );
       }
    }
    

    gruss Termite



  • Hi

    grrr doch noch ein paar flüchtigkeitsfehler drin. erstens alle aufrufe für set/getBorder müssen mit super. anfangen ( endlosschleifen )

    2. vergest das mit dem überladen von set/getBorder. Dadurch handelt man sich nur ganz hässliche probleme ein. irgendwo aus swing heraus wird mal getBorder aufgerufen. wenn man dann nicht den CompoundBorder angibt. sondern nur den inneren, verändert Swing die grösse des Borders selbständig auf die maximale component grösse. 😕

    na ja soweit so gut. mal schauen was noch so auf mich zukommt.

    [Edit]

    setBorder dürfen wir so wie oben dargestellt überschreiben. getBorder nicht.

    Weiter sollte im Constructor für den button noch folgende zeile mit rein. Sie verhindert das der hässliche Texteingabe Cursor über dem button erscheint.

    this.button.setCursor ( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR ));
    

    gruss Termite.



  • Na ob sich das lohnt? 🙂


Anmelden zum Antworten