title image


Smiley Re: paint bei eigener Komponente
Hi



Ich hab da eben schon ne Weile dran rumgemurkst - ds ist wirklich etwas komplizierter, als es im ersten Moment aussieht. Aber eine Sache vertehe ich schon ganz zu Anfang nicht: Von der Intuition her wäre die TextFieldBox doch eher ein Container, der 4 Components enthält - da bräuchte man dann nichtmal den Umweg über die verticalBox zu gehen, weil das Layout ein simples GridLayout(4,1) sein könnte. (Das würde das ganze IMHO schon wesentlich vereinfachen.



Daß deine TextFieldBox nicht gepaintet wird, liegt daran, daß sie nicht gepaintet werden muß. Sie hat nämlich keine Größe! Der LayoutManager von BoxTest ist 'null', und du weist deiner TFB keine Größe zu. Wenn du nach deinem TextFieldBox-Konstruktor-Aufruf mal die Zeile

cm.setBounds(270, 50, 52, 25*4+10);

einfügst, und innerhalb der paintComponent-Methode die Zeile

g.fillRect(300, 30, 50, 120);

ersetzt durch g.drawRect(drawHere.x,drawHere.y,drawHere.width-1,drawHere.height-1);

erkennt man immerhin schonmal die Umrisse :-)



Das schon angesprochene Layout-Problem wird deutlich, wenn du mal am ende der paint-Methode

System.out.println(tfBox.getComponent(0));

eingibst: Die Textfelder haben auch keine Größe!

Die Ausgabe ist: javax.swing.JTextField[,0,0,0x0,...



Das kannst du zwar scheinbar(!) beheben, indem du nach dem Hinzufügen der TextFields zur tfBox ein "tfBox.doLayout()" aufrufst, aber dann werden leider NUR die reichtgen Werte angezeigt - die TextFields bleiben invalid, und woran das liegt hab ich leider auch noch nicht rausgefunden... :-(



Übrigens müßten die Bounds für die tfBox nicht so

tfBox.setBounds(x,y,52,4*h+10);

sondern so

tfBox.setBounds(0,0,52,4*h+10);

gesetzt werden: Die Koordinaten beziehen sich auf das "Graphics"-Objekt, mit dem gezeichnet wird, und das ist sozusagen das "lokale Koordinatensystem" vom TextFieldBox 'cm' - das befindet sich schon bei (x,y), und relativ dazu ist dann die tfBox bei (0,0).



However, hier ist das mal mit TextBoxField als Container, anders hab ichs jetzt auch nicht hinbekommen (damit wird die tfBox zwar praktisch überflüssig, aber ich wollte so wenig textuelle Änderungen wie möglich vornehmen)





import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class BoxTest extends JFrame

{

public BoxTest()

{

setBounds(400,400,400,300);

setDefaultCloseOperation(EXIT_ON_CLOSE);

Container cp=getContentPane();

cp.setLayout(null);

JTextField tf1= new JTextField();

JTextField tf2= new JTextField();

tf1.setBounds(30,50,200,20);

tf2.setBounds(30,80,200,20);

TextFieldBox cm= new TextFieldBox(270,50,25);

cm.setBounds(270,50,52,4*25+10);

cp.add(tf1);

cp.add(tf2);

cp.add(cm);

setVisible(true);

}

public static void main(String[] args)

{ new BoxTest();

}

}

class TextFieldBox extends Container // Sorry - anders hab ichs auch nicht geschafft...

{

int x,y,h;

Box tfBox;

private JTextField tf1,tf2,tf3,tf4;

public TextFieldBox(int x, int y, int h)

{

this.x=x;

this.y=y;

this.h=h;

tfBox= Box.createVerticalBox();

tfBox.setBorder (BorderFactory.createLineBorder(Color.GRAY,5));

tf1 = new JTextField(5);

tf2 = new JTextField(5);

tf3 = new JTextField(5);

tf4 = new JTextField(5);

tfBox.add(tf1);

tfBox.add(tf2);

tfBox.add(tf3);

tfBox.add(tf4);

tfBox.setBounds(0,0,52,4*h+10);

add(tfBox); // Container

}



public void paintComponent(Graphics g)

{

//super.paintComponent(g); // Container

Rectangle drawHere = g.getClipBounds();

System.out.println(drawHere);

g.setColor( getForeground() );

// g.fillRect(300, 30, 50, 120);

g.drawRect(drawHere.x,drawHere.y,drawHere.width-1,drawHere.height-1);

// tfBox.paintComponent(g); // has protected access in javax.swing.JComponent



tfBox.paint(g); // Male (den Rahmen der) tfBox

tfBox.paintComponents(g); // male alle TextFields



}

}







Das ist jetzt nicht ganz, was du wolltest, aber wenn du die mit "Container" markierten Zeilen rausnimmst, ists praktisch wieder dein Originalprogramm - vielleicht helfen dir die anderen angesprochenen Punkte ja irgendwie weiter.



bye



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: