# Fenster aufteilen, aber mit welchem LayoutManager?



## marian04 (3. Sep 2011)

Hallo Leute,

da mir mein JavaBuch leider keine Antwort liefert, muss ich euch mal wieder eine Frage stellen.
Und zwar möchte ich mein JFrame sozusagen "aufteilen". Und zwar auf eine ganz bestimme Art und Weise : 1/3 zu 2/3
Okay ist klar, dass jetzt erstmal keiner versteht was ich meine, deswegen zeige ich es gleich anhand eines Bildes : 









Das zweite JPanel soll des öfteren ausgetauscht und mit neuen Textfeldern bestückt werden usw.

Ich hoffe mir kann jemand helfen.

Liebe Grüße


----------



## Camino (3. Sep 2011)

Hallo,

da gibt es bestimmt mehrere Möglichkeiten. Ich würde da verschiedene LayoutManager schachteln. Im Frame würde ich mit dem BorderLayout arbeite und Panel1 in den WEST-Bereich und Panel2 in den CENTER-Bereich einfügen. Für Panel2 würde ich CardLayout nehmen, dann kannst du mehrere Panels hinzufügen und zwischen denen hin- und herschalten.


----------



## marian04 (4. Sep 2011)

Okay, kann ich dann irgendwie die maximale Größe des ersten Panels festlegen, dass es nur so und so breit sein darf ? 



Lg


----------



## Camino (4. Sep 2011)

Versuch mal die Grösse des 1. Panels mit setPreferredSize und setMinimumSize festzulegen (am besten beides). Dann müsste eigentlich das Panel die gewünschte Grösse bekommen und auch behalten.


----------



## r.w. (4. Sep 2011)

Hallo Marian04,

alternativ geht das auch mit einem BorderLayout und einem JSplitPane im CENTER-Bereich.
Beim JSplitPane kann man die Position des Dividers festlegen und gegen Verschieben per Maus schützen.

Hier ein kurzes Beispiel:



```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
//import java.awt.Graphics;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;


public class SplitDemo extends JFrame{
    
    double dividerLocation = (1.0/3.0);
    
   
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {             
                new SplitDemo();
            }
        });        
    }
    

    SplitDemo() {
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("SplitDemo");
        
        pBack = new JPanel();
        pBack.setLayout(new BorderLayout());
        
        pMenu = new JPanel();
        pMenu.setBackground(Color.DARK_GRAY);
        pMenu.setPreferredSize(new Dimension(-1, 80));
        
        pLeft = new JPanel();
        pLeft.setBackground(Color.GRAY);
        
        pRight = new JPanel();
        pRight.setBackground(Color.LIGHT_GRAY);
        
        
        pSplit = new JSplitPane();
        pSplit.setEnabled(false);
        
        
        pSplit.add(pLeft, JSplitPane.LEFT);
        pSplit.add(pRight, JSplitPane.RIGHT);
        
        
        pBack.add(pMenu, BorderLayout.NORTH);
        pBack.add(pSplit, BorderLayout.CENTER);
        
        add(pBack);

        setSize(800,600);
        setVisible(true);

        pSplit.setDividerLocation(dividerLocation);
        pSplit.setDividerSize(1);
        
    }
    

//    @Override
//    public void paint(Graphics g) {
//        pSplit.setDividerLocation(dividerLocation);
//        super.paint(g);
//    }

    
    JPanel pBack;
    JPanel pMenu;
    JSplitPane pSplit;
    JPanel pLeft;
    JPanel pRight;

}
```


Wenn die Drittel-Aufteilung auch erhalten bleiben soll, wenn der JFrame in der
Größe verändert wird, füge einfach die auskommentierten Zeilen wieder ein.

Das mit der Paint-Methode ist zwar nicht die sauberste Lösung, aber sicher
die mit dem geringeren Aufwand. Was man noch tun könnte, wäre innerhalb
der paint-Methode zu prüfen, ob sich die Größe des JFrames tatsächlich geändert
hat. Eine weitere Möglichkeit wäre ein Component-Listener (der eigentlich für 
Resize-Events zuständig ist). Dieser löst das Event (zumindest auf dem Mac) 
jedoch leider nicht während des Vorgangs der Vergrößerung aus, sondern erst am Ende. 

Ich hoffe, das hilft Dir weiter.

VG ROlf


----------



## marian04 (4. Sep 2011)

> ButtonPanel.setPreferredSize(new Dimension(650,600));
> ButtonPanel.setMinimumSize(new Dimension(650,600));
> ButtonPanel.add(lc1);
> 
> ...



Bringt leider gar nichts


----------



## Camino (4. Sep 2011)

Ein bisschen mehr Code wäre nicht schlecht. Was sind lc1, lc2 und c? Und wo kommen die her? Wie und wo werden ButtonPanel und LaeuferPanel erstellt? Wo werden welche LayoutManager benutzt?


----------



## marian04 (4. Sep 2011)

Ja ich weiß, der Code-Schnippel war ein wenig kurz, aber die andere Methode hat super geklappt.

Musste das nur ein wenig auf meine Bedürfnisse anpassen.
Sehr saubere Lösung gefällt mir wirklich gut. Vielen dank 



Liebe Grüße


----------



## Camino (4. Sep 2011)

???:L


----------



## marian04 (4. Sep 2011)

```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
//import java.awt.Graphics;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 03.09.2011
  * @Marian
  */

public class oberfla extends JFrame {
  // Anfang Attribute
	// Menü
	JMenuBar menuBar = new JMenuBar();
	JMenu menu,menu1;
	JMenuItem Startseiteme,Laeufersucheme,Sponsorensucheme,Beendenme,Hilfeme,Aboutme;
	
	Methoden meth = new Methoden();
	
	JButton newRunner = new JButton("Neuer Läufer");
	JButton newSponsor = new JButton("Neuer Spnsor");
	JButton editRounds = new JButton("Runden eintragen");
	JButton printRechnung = new JButton("Rechnung drucken");
	JPanel pBack = new JPanel(); 
	JPanel pMenu = new JPanel();
	JPanel pLeft = new JPanel();
	JPanel pRight = new JPanel();
	JSplitPane pSplit = new JSplitPane();
	JLabel lc1 = new JLabel("lc1");
	JLabel lc2 = new JLabel("lc2");
	
	JTextField NachName = new JTextField("1");	
	JTextField VorName = new JTextField("2");	
	JTextField Alter = new JTextField("3");	
	JTextField Strasse = new JTextField("4");	
	JTextField HausNummer = new JTextField("5");	
	JTextField PostleitZahl = new JTextField("6");	
	JTextField Ort = new JTextField("7");	
	
	
	
	double dividerLocation = (1.0/4.0);
  // Ende Attribute

  public oberfla(String title) {
	  super(title);
	  
	 
	  setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	  int frameWidth = 800;
	  int frameHeight = 600;
	  setSize(frameWidth, frameHeight);
	  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	  int x = (d.width - getSize().width) / 2;
	  int y = (d.height - getSize().height) / 2;
	  setLocation(x, y);
	  Container c = getContentPane();
	 
	  // Menu
	  menu = new JMenu("Menü");
      menu1 = new JMenu("Info");
      
      Startseiteme = new JMenuItem("Startseite");
      menu.add(Startseiteme);
      Laeufersucheme = new JMenuItem("Läufersuche");
      menu.add(Laeufersucheme);
      Sponsorensucheme = new JMenuItem("Sponsorensuche");
      menu.add(Sponsorensucheme);
      Beendenme = new JMenuItem("Beenden");
      menu.add(Beendenme);
      
      Hilfeme = new JMenuItem("Hilfe");
      menu1.add(Hilfeme);
      Aboutme = new JMenuItem("About");
      menu1.add(Aboutme);
      
      menuBar.add(menu);
      menuBar.add(menu1);
      setJMenuBar(menuBar);
   
      // Aufteilung der Labels
      pBack.setLayout(new BorderLayout());
      pMenu.setBackground(Color.DARK_GRAY);
      pMenu.setPreferredSize(new Dimension(-1, 80));

      pLeft.setBackground(Color.GRAY);
      pLeft.setLayout(new FlowLayout());
      pLeft.add(newRunner);
      pLeft.add(newSponsor);
      pLeft.add(editRounds);
      pLeft.add(printRechnung);
      

      pRight.setBackground(Color.LIGHT_GRAY);
      pRight.setLayout(new FlowLayout());
      pRight.add(NachName);

      pSplit.setEnabled(false);

      pSplit.add(pLeft, JSplitPane.LEFT);
      pSplit.add(pRight, JSplitPane.RIGHT);

      pBack.add(pMenu, BorderLayout.NORTH);
      pBack.add(pSplit, BorderLayout.CENTER);

      add(pBack);

      setSize(800,600);
      setVisible(true);

      pSplit.setDividerLocation(dividerLocation);
      pSplit.setDividerSize(1);


   
    


    setResizable(false);
    setVisible(true);  
    
    // Aktionlistener Zuweisungen 
    Startseiteme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	StartseitemeMenuItemActionPerformed(evt);
        }
    });
    
    Laeufersucheme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	LaeufersuchemeMenuItemActionPerformed(evt);
        }
    });
    
    Sponsorensucheme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	SponsorensuchemeMenuItemActionPerformed(evt);
        }
    });
    
    Beendenme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	BeendenmeMenuItemActionPerformed(evt);
        }
    });
    
    Hilfeme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	HilfemeMenuItemActionPerformed(evt);
        }
    });
    
    Aboutme.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	AboutmeMenuItemActionPerformed(evt);
        }
    });
    
    
    // ActionListener für Buttons
    
    newRunner.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	newRunnerMenuItemActionPerformed(evt);
        }
    });
    
    newSponsor.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	newSponsorMenuItemActionPerformed(evt);
        }
    });
    
    editRounds.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	editRoundsMenuItemActionPerformed(evt);
        }
    });
    
    printRechnung.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
        	printRechnungMenuItemActionPerformed(evt);
        }
    });
  
    
  }
  

  // Anfang Methoden
  private void newRunnerMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
	
	
	JPanel jp = new JPanel();
	pRight.add(jp);
	
	jp.add(VorName);
	jp.add(Alter);
	jp.add(Strasse);
	jp.add(HausNummer);
	jp.add(PostleitZahl);
	jp.add(Ort);
	System.out.print("hallo");
	repaint();
  }

  private void editRoundsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		
	}
  
  private void printRechnungMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		
	}

  
  private void newSponsorMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		
	}

  private void StartseitemeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		
	}


  private void LaeufersuchemeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
	   
    	meth.SucheVorNachNameLaufer("Bauer", "Martin");
    	
		}
  
    private void SponsorensuchemeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
		}
  	private void BeendenmeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
	this.dispose();
  		}
  
	private void HilfemeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:
		}
  
	private void AboutmeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
		// TODO add your handling code here:
		}
  // Ende Methoden

  
	
	public static void main(String[] args) {
    new oberfla("Laufsoftware");
  }
}
```

Hier mal der Code, den ich bis jetzt zusammen habe.

Leider macht mir das Adden von Komponenten via Button irgendwie schwierigkeiten.

Lg


----------



## L-ectron-X (4. Sep 2011)

[JAVA=217]validate(); //repaint(); entfernen[/code]


----------

