Umsetzung Stammbaumes

Seppel

Bekanntes Mitglied
Hallo,
ich habe ein JFrame mit JButtons und Bildern erzeugt in Form eines Stammbaumes, so das später auf die Buttons geklickt werden kann um die Person aus zuwählen.

All diese Elemente werden in ein scrollpane eingefügt
JScrollPane scrollpane = new JScrollPane(panel1);
und dieses dann dem Fenster.

Leider wird alles was nicht auf die erste Seite(ohne scrollen) passt abgeschnitten und nach dem Scrollen ist dies nicht mehr sichtbar.



Es fehlt eine ganze Reihe (Kind+Frau+Enkel) ,wenn ich weiter oben zb die Alteltern wegfallen lasse sind ist die Reihe wieder da
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Ungeduldig? :noe: Welchen LayoutManager hat das panel? Ggf. musst du mit
panel.setPreferredSize(someSize);
die größe explizit setzen, zur Laufzeit ggf. noch ein
panel.validate();
hinterher...
 

Seppel

Bekanntes Mitglied
nein nicht ungedultig falscher eintrag... und komplett löschen ging ne,
schon gemacht, hier mal der Code:
aufruf:
Java:
 NeueCronik_stammbaum =new StammbaumFenster ("");          	  
        	  NeueCronik_stammbaum.pack();
        	 // NeueCronik_stammbaum.setPreferredSize(new Dimension(NeueCronik_person.getWidth()+10,NeueCronik_person.getHeight()-50);
        	 // NeueCronik_stammbaum.setSize(1000,900);
        	  NeueCronik_stammbaum.setResizable(false);
        	  NeueCronik_stammbaum.setVisible(true);
und hier nur das fenster
Java:
public class StammbaumFenster extends JFrame{
	  JButton Personen[] = new JButton[33];	  
	  JButton KinderEnk[][] = new JButton[21][23];//0=Kind Rest Enkel
	  JLabel Pfeile[] = new JLabel[88];
	  JScrollPane scrollpane;
	  
	  private static final long serialVersionUID = 1L;
	  
		void addComponent( Container cont, GridBagLayout gbl,Component c,int x, int y,int width, int height,double weightx, double weighty,int typ , int schriftgroese){
			 GridBagConstraints gbc = new GridBagConstraints();
			 gbc.fill = GridBagConstraints.BOTH;
			 gbc.gridx = x; gbc.gridy = y;
			 gbc.gridwidth = width; gbc.gridheight = height;
			 gbc.weightx = weightx; gbc.weighty = weighty;
			 int Breite=30, Hoehe=40;
			 int Breite2=27, Hoehe2=40;			 
			
				 if (typ==1) {
					 ((JButton) c).setMargin(new Insets(0, 0, 0, 0));				 
					 ((JButton) c).setFont(new Font("Arial", Font.PLAIN,schriftgroese));				
				 }			 
				 //2-24 sind Bilder		 								 
				 gbl.setConstraints(c, gbc );	
				 cont.add( c );
		 }
				
		class MyAdjustmentListener implements AdjustmentListener {		   
		    public void adjustmentValueChanged(AdjustmentEvent evt) {	
		    	//NeueCronik_stammbaum.setSize(new Dimension(1000,900));
		    	//NeueCronik_stammbaum.validate();
		    	NeueCronik_stammbaum.repaint();	
		    	//NeueCronik_stammbaum.validate();
		    	scrollpane.revalidate();
		    	scrollpane.updateUI();
		    	scrollpane.repaint();
		    	//NeueCronik_stammbaum.repaint();


		    	
		    }
		}

		
		StammbaumFenster(String titel){
			 super(titel); 		
			  GridBagLayout gbl = new GridBagLayout();
			  Panel panel1 = new Panel();			  			  			  	
			  panel1.setLayout(gbl);	  

			  int i=0;
			  //Hier Namen eintragen
			  for ( i=0;i<32;i++){	Personen[i]=new JButton("<html>Max<br> Muster</html>");}
			  for ( i=0;i<21;i++){	
				  for (int j=0;j<21;j++){
					  if (j<5 && i<21) KinderEnk[i][j]=new JButton("<html>Mäxchen<br> Muster</html>");
					  else KinderEnk[i][j]=new JButton("");
				  }
				  
			  }			  
			  for ( i=0;i<88;i++){ Pfeile[i]=new JLabel("");}
			  
			  //zeichen######################
			  for ( i=1;i<35;i++){	addComponent( panel1, gbl, new JLabel("<--->"), i , 0, 1, 1, 0 , 0 ,0,8);}				  	
			  //Alteltern					                                        x   y  w  h  wx wy typ Schriftgröße
			 for (i=0 ;i<8 ;i++){ //	                           x   y  w  h  wx wy typ Schriftgröße
				  addComponent( panel1, gbl, Personen[i*2]   , 4*i+2 , 1, 3, 1, 0 , 0 ,1  ,9 );
				  addComponent( panel1, gbl, Personen[i*2+1] , 4*i+2 , 2, 3, 1, 0 , 0 ,1  ,9 );
				  addComponent( panel1, gbl, Pfeile[i*2]     , 4*i+1 , 1, 3, 1, 0 , 0 ,21 ,9 );
				  addComponent( panel1, gbl, Pfeile[i*2+1]   , 4*i+1 , 2, 3, 1, 0 , 0 ,20 ,9 );
				  addComponent( panel1, gbl, Pfeile[i+16 ]   , 4*i+1 , 3, 3, 1, 0 , 0 ,3  ,9 );
			  }			  		  		 			  
			  
			  //Urgroßeltern					                                    x   y  w  h  wx wy typ Schriftgröße
			  for (i=0 ;i<8 ;i++){ addComponent( panel1, gbl, Personen[i+16]  , i*4+1 , 4, 3, 1, 0 , 0 ,1  ,10);}			  
			  for (i=0 ;i<4 ;i++){ addComponent( panel1, gbl, Pfeile[i+24]    , i*8+4 , 4, 1, 1, 0 , 0 ,2  ,10);}			  			  
			  //Pfeil Reihe					           						        x   y  w  h  wx wy typ Schriftgröße
			  for (i=0 ;i<4 ;i++){ addComponent( panel1, gbl, Pfeile[i+28]    , i*8+4 , 5, 1, 1, 0 , 0 ,3  ,10);}	
			  //Großeltern					          					  	       x   y  w  h  wx wy typ Schriftgröße
			  for (i=0 ;i<4 ;i++){ addComponent( panel1, gbl,  Personen[i+24] , i*8+2 , 6, 5, 1, 0 , 0 ,1  ,12);}	
			  //							           x   y  w  h  wx wy typ Schriftgröße
			  addComponent( panel1, gbl, Pfeile[32]  , 7 , 6, 1, 1, 0 , 0 ,5  ,11);
			  addComponent( panel1, gbl, Pfeile[35]  , 23, 6, 1, 1, 0 , 0 ,5  ,11);			  
			  addComponent( panel1, gbl, Pfeile[33]  , 8 , 6, 1, 1, 0 , 0 ,4  ,11);
			  addComponent( panel1, gbl, Pfeile[36]  , 24, 6, 1, 1, 0 , 0 ,4  ,11);			  
			  addComponent( panel1, gbl, Pfeile[37]  , 25, 6, 1, 1, 0 , 0 ,6  ,11);
			  addComponent( panel1, gbl, Pfeile[34]  , 9 , 6, 1, 1, 0 , 0 ,6  ,11);
			  //Pfeil Reihe					           						         x   y  w  h  wx wy typ Schriftgröße
			  for (i=0;i<2 ;i++){ addComponent( panel1, gbl, Pfeile[i+38]     , i*16+8 , 7, 1, 1, 0 , 0 ,3  ,12);}
			  //eltern					               							     x   y  w  h  wx wy typ Schriftgröße
			  for (i=0;i<2 ;i++){ addComponent( panel1, gbl, Personen[i+28]   , i*16+5 , 8, 7, 1, 0 , 0 ,1  ,14);}	
			  //	          						   x   y  w  h  wx wy typ Schriftgröße
			  addComponent( panel1, gbl, Pfeile[40]  , 12, 8, 4, 1, 0 , 0 ,7  ,14);
			  addComponent( panel1, gbl, Pfeile[41]  , 16, 8, 1, 1, 0 , 0 ,4  ,14);
			  addComponent( panel1, gbl, Pfeile[42]  , 17, 8, 4, 1, 0 , 0 ,8  ,14);
			  //Pfeil Reihe					           x   y  w  h  wx wy typ Schriftgröße
			  addComponent( panel1, gbl, Pfeile[43]  , 16, 9, 1, 1, 0 , 0 ,3  ,14);
			  //Akt_person					            x   y  w  h  wx wy typ Schriftgröße
			  addComponent( panel1, gbl, Personen[30], 12, 10, 9, 1, 0 , 0 ,1  ,16);			
			  addComponent( panel1, gbl, Personen[31], 13, 11, 9, 1, 0 , 0 ,1  ,14);			
			  if (KinderEnk[0][0].getText()==""){
				addComponent( panel1, gbl, Pfeile[44], 12, 11, 1, 1, 0 , 0 ,16 ,16);			
			  }
			  else{
				addComponent( panel1, gbl, Pfeile[44], 12, 11, 1, 1, 0 , 0 ,9  ,16);	
				addComponent( panel1, gbl, Pfeile[45], 2 , 11,10, 1, 0 , 0 ,24 ,16);
				addComponent( panel1, gbl, Pfeile[46], 1 , 11, 1, 1, 0 , 0 ,11 ,16);
				addComponent( panel1, gbl, Pfeile[47], 1 , 12, 1, 1, 0 , 0 ,3  ,16);				
			  }
				  
			  //Kinder	
			  int  j=1;
			  int pnr=48;
			  for (int t=0;t<5;t++){	
				  i=0;					  
				  while (KinderEnk[i+t*4][0].getText()!="" && i<4){
					  KinderEnk[i+t*4][0].setText("Kind");KinderEnk[i+t*4][1].setText("Frau");
					  addComponent( panel1, gbl, KinderEnk[i+t*4][0], i*8+2 , 14+t*14, 5, 1, 0 , 0 ,1  ,11);
					  addComponent( panel1, gbl, KinderEnk[i+t*4][1], i*8+3 , 15+t*14, 5, 1, 0 , 0 ,1  ,11);
					  //enkel
					  j=1;				
					  while (j<10){	
						  if (!(KinderEnk[i+t*4][j*2].getText()).equals("")) addComponent( panel1, gbl, KinderEnk[i+t*4][j*2]    , i*8+3 , 17+j+t*14, 3, 1, 0 , 0 ,1  ,7);					  
						  if (!(KinderEnk[i+t*4][j*2+1].getText()).equals("")) addComponent( panel1, gbl, KinderEnk[i+t*4][j*2+1], i*8+6 , 17+j+t*14, 3, 1, 0 , 0 ,1  ,7);
						  j++;
					  }
					  i++;
				  }	
				  
				  if (KinderEnk[(t+1)*4][0].getText().equals("")){addComponent( panel1, gbl, Pfeile[pnr], 1 , 13+t*14, 1, 1, 0 , 0 ,16 ,16);	pnr++;}
				  else{addComponent( panel1, gbl, Pfeile[pnr], 1 , 13+t*14, 1, 1, 0 , 0 ,13 ,16);	pnr++;}
			  }			
			  
			  scrollpane = new JScrollPane(panel1);		
			  
			  scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
			  scrollpane.getVerticalScrollBar().addAdjustmentListener(new MyAdjustmentListener());
			  
			  add(scrollpane);			  
		  }	  
  }

Ich weiß bissel viel, aber für den anfang lieber alles, habe bereits ähnliche Probleme bei anderen foren gefunden, aber keine Lösung.
 

Seppel

Bekanntes Mitglied
So folgende erkenntnisse:
Neu zeichnen des Panels oder Scrollpanel nützt nichts, der Fehlende Inhalt kommt dort nicht an.
Nur das verändern der Größe während der LAufzeit zeichnet den Fensterinhalt ander geöffneten Stelle neu.
 

Seppel

Bekanntes Mitglied
Ja ich weiß, hier mal ein Beispiel:
Java:
import java.awt.*; 
import java.awt.event.*;
import javax.swing.*;
public class Chronik2 extends JFrame  { //implements AdjustmentListener
 private static final long serialVersionUID = 1L;
	
  JScrollPane scrollpane;
  JButton Personen[] = new JButton[33];	
 
  public static void main(String[] args) {	  
	  Chronik2 NeueCronik_stammbaum =new Chronik2("Test");          	  
	  NeueCronik_stammbaum.pack();        	
	  NeueCronik_stammbaum.setSize(500,400);
	  NeueCronik_stammbaum.setResizable(false);
	  NeueCronik_stammbaum.setVisible(true);
  }
  
  void addComponent( Container cont, GridBagLayout gbl,Component c,int x, int y,int width, int height,double weightx, double weighty,int typ , int schriftgroese){
		 GridBagConstraints gbc = new GridBagConstraints();
		 gbc.fill = GridBagConstraints.BOTH;
		 gbc.gridx = x; gbc.gridy = y;
		 gbc.gridwidth = width; gbc.gridheight = height;
		 gbc.weightx = weightx; gbc.weighty = weighty;			 			 
		
			 if (typ==1) {
				 ((JButton) c).setMargin(new Insets(0, 0, 0, 0));				 
				 ((JButton) c).setFont(new Font("Arial", Font.PLAIN,schriftgroese));				
			 }			 
			 gbl.setConstraints(c, gbc );	
			 cont.add( c );
	 }  

   Chronik2 (String titel) {
	   super(titel);    
	   
	   class MyAdjustmentListener implements AdjustmentListener {		   
		    public void adjustmentValueChanged(AdjustmentEvent evt) {		    	
		    	System.out.println("Change");		    		    		 	
		    }
		}
	   GridBagLayout gbl = new GridBagLayout();
		  Panel panel1 = new Panel();			  			  			  	
		  panel1.setLayout(gbl);	  

		  int i=0;
		  for ( i=0;i<32;i++){	Personen[i]=new JButton("<html>Max<br> Muster</html>");}	
		  for ( i=1;i<34;i++){	addComponent( panel1, gbl, new JLabel("<--->"), i , 0, 1, 1, 0 , 0 ,0,8);}	 
		  for (i=0 ;i<8 ;i++){ 
			  addComponent( panel1, gbl, Personen[i*2]   , 4*i+2 , 1+i*2, 3, 1, 0 , 0 ,1  ,9 );
			  addComponent( panel1, gbl, Personen[i*2+1] , 4*i+2 , 2+i*2, 3, 1, 0 , 0 ,1  ,9 );				  
		  }		
		  scrollpane = new JScrollPane(panel1);				  
		  scrollpane.getVerticalScrollBar().addAdjustmentListener(new MyAdjustmentListener());			  
		  add(scrollpane);			
   }
}

Wenn du im Fenster nach die Balken benutzt und zb nach rechts unten scrollstdann fehlen dort alle Buttons, obwohl dort welche sein müssen

 
G

Gast2

Gast
Auch wenn das das Problem nicht direkt löst:

Hast du schon mal Forms Layout verwendet? Wenn ich deinen GridBagLayout Code sehe wird mir richtig schwummerig. Mit Form geht sowas extrem einfach und Proportional portierbar, und das bei lesbarem GUI-Code.

Mir hat das viele schlaflose Nächte erspart. Möchte es nicht mehr missen!
 
G

Gast2

Gast
Es lohnt sich wirklihc. Ist nach kurzer Eingewöhnungszeit extrem vielseitig und dann auch extrem komfortabel. Mir hats echt nen Haufen Arbeit erspart. Vor allem was Alignments in Dialogen (Name Wert Paare ect.) angeht.
 

Ähnliche Java Themen

Neue Themen


Oben