Swing JToolBar Probleme

Status
Nicht offen für weitere Antworten.

maxth

Aktives Mitglied
Hallo Leute,

ich hab ein paar Probleme mit der JToolBar, ich hab mir eine Seite mit JToolBar elementen geschrieben.

Meine Toolbar elemente sind oben links. Ich würde diese aber gerne unten und in der Mitte von der Seite angezeigt bekommen. Dann würde ich gerne die Größe der Elemente bestimmen. Genauso mit meinen Textfeldern.

Desweiteren weiß ich nicht, wie ich den JButtons referenzen übergeben soll. Ich hab in meinem Code eine ShowNext Methode, die der Button nach "Vorwärts" übernehmen soll.

Vielen Dank für eure Hilfe.

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class ShowViewer extends JFrame implements ActionListener{
	
    WohnungVerwalter wohnung = new WohnungVerwalter(); 
	Container cp = this.getContentPane();
	String iconsDirectory = "icons/";
	
	int counter; 

		
	  private JTextField textField1;
	  private JTextField textField2;
	
	public ShowViewer(){
		
		super("Wohnung anzeigen");
		
		this.setSize(800,600);		
		JToolBar toolBar = new JToolBar();
		addButtons(toolBar);
		addTextFelder();
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		cp.add(textField1);
		cp.add(textField2);
		cp.add( toolBar,BorderLayout.PAGE_START);
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
	}	
	
	public void addTextFelder (){
		textField1 = new JTextField();
        textField2 = new JTextField();
		
	}
	
	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("links", "Zurück" );
		toolBar.add(button);
		button = createButton( "rechts", "Vorwärts" );
		toolBar.add(button);
		button = createButton("stift", "Bearbeiten");
		toolBar.add(button);
		button = createButton("delete", "Löschen");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".png";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	
	
	
	
	   public void showNext() {
		    
			counter++;
			
		    if (counter>=wohnung.list.size()) counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		   
		
	}
	    public void deleteCurrent(){
	    	
	    	String d;
	    	String s; 
	    	
	    	d = (wohnung.list.get(counter).getID());
	    	//vb.verbinden();
	    	
	    	s = "DELETE FROM `mkb`.`vermieter` WHERE `vermieter`.`ID` =" + d;
	    	 
	    	
	    	
	    	
	    }
	  public void showLast() {
		    
			counter--;
			
		    if (counter<= 1) //counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		    

		
		
	}
	
	public static void main (String[] args){
		new ShowViewer();		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}}
 
Hallo auch.

Desweiteren weiß ich nicht, wie ich den JButtons referenzen übergeben soll. Ich hab in meinem Code eine ShowNext Methode, die der Button nach "Vorwärts" übernehmen soll.
...damit meinst du vermutlich, dass du gerne hättest, dass die showNext() aufgerufen wird, wenn du den "Vorwärts" klickts?
Das geht über den ActionListener, den du ja schon an deine Buttons bindest. In der Methode actionPerformed() musst du dann den Klick auswerten:
Java:
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        if (e.getActionCommand().compareTo("rechts") == 0)
            this.showNext();
        //gleiches für alle anderen buttons, bzw. Action Commands
    }

Zu deiner ersten Fragen bin ich mir unschlüssig, was die eigentliche Frage ist, aber JToolBars funktionieren am besten, wenn sie in einem BorderLayout sitzen, weil man sie dann in quasi alle Ecken verschieben kann. Üblicherweise sind sie immer oben angebracht:
Java:
this.setLayout(new BorderLayout());
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(true); //jetzt kann man sie via Maus herumschieben
//toolbar befüllen
this.add(toolbar, BorderLayout.NORTH);

Was die Größen und das Layouting angeht, fügt die Toolbar automatisch alle Komponenten rechts an und richtet ihre Größe nach ihrem Inhalt. Die Buttons richten ihre Größe nach dem Text und/oder den Icons darauf. Wenn du es anders haben willst, musst du ggfs mit
Code:
setMinimumSize(Dimension)
und/oder
Code:
setMaximumSize(Dimension)
arbeiten.
 
Vielen Dank für deine Antwort KrokoDiehl.

Das mit dem Button hat sehr gut funktioniert, hätte ich eigentlich auch selber drauf kommen müssen.

In die Seite die ich geschrieben habe, sollen noch jede Menge Textfelder kommen.
Wie kann ich diese denn am besten Anordnen. Und sind diese auch am richtigen Platz??!

Diesen Teil den hier geschrieben habe, soll als panel in eine andere GUI kommen.

Geht das in Ordnung?
 
Klar kannst du deinen bisherigen Teil als Panel in etwas anderes einfügen. Aber das freie platzieren der Toolbar könnte dabei verloren gehen, denn soweit ich weiß funktioniert es nur, wenn die Toolbar im BorderLayout des Hauptfensters ist. Daher wäre es empfehlenswert die Toolbar eben in deinem JFrame nach
Code:
BorderLayout.NORTH
zu legen und deine übrigen Komponenten ins
Code:
BorderLayout.CENTER
.

Wenn ich es recht verstehe, planst du viele Textfelder auf die Toolbar zu legen? Weil das würde ich nicht machen (es sei denn du willst es so), denn es wird mit dem Layouting definitiv schwierig.
Ich würds in ein normales Panel mit einem LayoutManager machen. Aber das hängt alles davon ab, wie du es haben willst (GridLayout, GridBagLayout, FlowLayout, ...).
Dieses Panel kann man übrigens dann auch in die Toolbar legen, wenn man es möchte 😉

Java:
class MyFrame extends JFrame
{
    public MyFrame()
    {
        super("Mein Titel");
        this.setLayout(new BorderLayout());
        
        JToolBar toolbar = new JToolBar("Meine Toolbar");
        //toolbar zusammenbauen
        this.add(toolbar, BorderLayout.NORTH);

        JPanel myPanel = this.createMyPanel(); //hier kann du dann den Hauptteil zusammenschrauben
        this.add(myPanel, BorderLayout.CENTER);
        // ODER:
        toolbar.add(myPanel); 
        
        //sonstige Frameeinstellungen
    }
    //usw.
}

Wie kann ich diese denn am besten Anordnen. Und sind diese auch am richtigen Platz??!
...dazu kann ich nur sagen: "Kommt drauf an." 🙂
Jenachdem wie die Felder angeordnet sein sollen ist der eine LayoutManager besser als der andere. Hier würde ich mal die Swing API lesen, was es so gibt.
 
Hallo,

Vielen Dank für deine antworten, ich bräuchte aber noch mal deine Hilfe.

Und zwar würde ich gerne im Panel ein Hintergrundbild haben. Und in noch einem Panel die Hintergrundfarbe. Ist vielleicht recht Simple, aber bis lief bei mir alles auf Fehlern hinaus.

Danke

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class GUI_Main extends JFrame implements ActionListener{
	

	Container cp = this.getContentPane();
	String iconsDirectory = "icons/";
	


	
	
	public GUI_Main(){
		
		super("Mietnebenkostenberechnung");
		
		this.setLayout(new BorderLayout());
		this.setSize(800,600);		
		
		
		JToolBar toolBar = new JToolBar("Toolbar");
        
        
        addButtons(toolBar);
		toolBar.setFloatable(true);
		toolBar.setRollover(true);
		this.add(toolBar, BorderLayout.NORTH);
		
        JPanel myPanel = new JPanel(); //hier kann du dann den Hauptteil zusammenschrauben
        
        
        this.add(myPanel, BorderLayout.CENTER);
      
       

		//JToolBar toolBar = new JToolBar();
		//addButtons(toolBar);
		
		//toolBar.setFloatable(true);
		//toolBar.setRollover(true);
		//cp.add( toolBar,BorderLayout.PAGE_START);
		//this.add(toolBar, BorderLayout.NORTH);
		
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
	}	
	
	
	
	



	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("neu", "Neue Wohnung anlegen" );
		toolBar.add(button);
		button = createButton( "wohnung", "Wohnungen Anzeigen" );
		toolBar.add(button);
		button = createButton("rechnung", "Rechnungen Anzeigen");
		toolBar.add(button);
		button = createButton("mieter", "Mieter Anzeigen");
		toolBar.add(button);
		button = createButton("benutzer", "Benutzer Anzeigen" );
		toolBar.add(button);
		button = createButton( "statistik", "Statistiken" );
		toolBar.add(button);
		button = createButton("hilfe", "Online Hilfe");
		toolBar.add(button);
		button = createButton("info", "MKB Info");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	

	
	public static void main (String[] args){
		new GUI_Main();		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		

		
	}}
 
vergesst das was ich in der antwort oben drüber geschrieben habe,

es funktioniert jetzt so wie ich es möchte.

Eine Frage habe ich noch kann ich ein Frame in ein Panel packen?

Ist das Möglich, und was sollte ich umändern?

Diese Klasse hätte ich gerne in einem Panel

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class ShowViewer extends JFrame implements ActionListener{
	
    WohnungVerwalter wohnung = new WohnungVerwalter(); 
	Container cp = this.getContentPane();
	String iconsDirectory = "icons/";
	
	int counter; 

		
	  private JTextField textField1;
	  private JTextField textField2;
	
	public ShowViewer(){
		
		super("Wohnung anzeigen");
		
		this.setSize(800,600);		
		JToolBar toolBar = new JToolBar();
		addButtons(toolBar);
		addTextFelder();
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		cp.add(textField1);
		cp.add(textField2);
		cp.add( toolBar,BorderLayout.PAGE_START);
		this.add(toolBar, BorderLayout.SOUTH);
		
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
	}	
	
	public void addTextFelder (){
		textField1 = new JTextField("Penis");
        textField2 = new JTextField();
		
	}
	
	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("links", "Zurück" );
		toolBar.add(button);
		button = createButton( "rechts", "Vorwärts" );
		toolBar.add(button);
		button = createButton("blume", "Bearbeiten");
		toolBar.add(button);
		button = createButton("delet", "Löschen");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	
	
	
	
	   public void showNext() {
		    
			counter++;
			
		    if (counter>=wohnung.list.size()) counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		   
		
	}
	    public void deleteCurrent(){
	    	
	    	String d;
	    	String s; 
	    	
	    	d = (wohnung.list.get(counter).getID());
	    	//vb.verbinden();
	    	
	    	s = "DELETE FROM `mkb`.`vermieter` WHERE `vermieter`.`ID` =" + d;
	    	 
	    	
	    	
	    	
	    }
	  public void showLast() {
		    
			counter--;
			
		    if (counter<= 1) //counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		    

		
		
	}
	
	public static void main (String[] args){
		new ShowViewer();		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().compareTo("rechts") == 0)
            this.showNext();

		
	}}
 
Zuletzt bearbeitet:
Hallo.
Nein ein Frame kannst man nicht in ein Panel packen. Ein Frame ist bereits ein eigenständiges Fenster und somit ein Container für Panels.
In deinem Beispiel müsstest du statt von JFrame von JPanel erben. Damit entfallen dann einige Methoden wie
Code:
setDefaultCloseOperation()
und einen
Code:
setVisible()
-Aufruf brauchst du dann auch nicht mehr (das wird dann später vom Container geregelt, der dein Panel beinhaltet).
 
Also das heißt ich mach einfach nur aus dem Frame ein Panel.

Ich hab das jetzt versucht umzusetzen.

Darf ich ein BorderLayout auch im Panel benutzen?

Und wenn ich das Panel in das Frame einbauen möchte habe ich das mit.

Panel.add(new ShowViewer()); gemacht, ist das richtig`?

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class ShowViewer extends JPanel implements ActionListener{
	
    WohnungVerwalter wohnung = new WohnungVerwalter(); 
	Container cp = this.getRootPane();
	String iconsDirectory = "icons/";
	
	int counter; 

		
	  private JTextField textField1;
	  private JTextField textField2;
	
	public ShowViewer(){
		
		//super("Wohnung anzeigen");
		
		this.setSize(800,600);		
		JToolBar toolBar = new JToolBar();
		addButtons(toolBar);
		addTextFelder();
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		cp.add(textField1);
		cp.add(textField2);
		cp.add( toolBar,BorderLayout.PAGE_START);
		this.add(toolBar, BorderLayout.SOUTH);
		
		
		//this.setContentPane(cp);
		//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
	}	
	
	public void addTextFelder (){
		textField1 = new JTextField();
        textField2 = new JTextField();
		
	}
	
	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("links", "Zurück" );
		toolBar.add(button);
		button = createButton( "rechts", "Vorwärts" );
		toolBar.add(button);
		button = createButton("blume", "Bearbeiten");
		toolBar.add(button);
		button = createButton("delet", "Löschen");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	
	
	
	
	   public void showNext() {
		    
			counter++;
			
		    if (counter>=wohnung.list.size()) counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		   
		
	}
	    public void deleteCurrent(){
	    	
	    	String d;
	    	String s; 
	    	
	    	d = (wohnung.list.get(counter).getID());
	    	//vb.verbinden();
	    	
	    	s = "DELETE FROM `mkb`.`vermieter` WHERE `vermieter`.`ID` =" + d;
	    	 
	    	
	    	
	    	
	    }
	  public void showLast() {
		    
			counter--;
			
		    if (counter<= 1) //counter = 0;
		    textField1.setText(wohnung.list.get(counter).getName());
		    textField2.setText(wohnung.list.get(counter).getMieterName());
		    

		
		
	}
	
	public static void main (String[] args){
		new ShowViewer();		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().compareTo("rechts") == 0)
            this.showNext();

		
	}}
 
Also in deinem Beispiel finde ich den JFrame nicht. Aber vorerst einmal: Ja, BorderLayout geht bei JFrame und bei JPanel (...und sollte auch überall da gehen, wo man LayoutManager benutzen kann).

Desweiteren habe ich mir mal erlaubt, deinen Code entsprechend zu gestalten, sodass du dein eigene Panel in einen Frame setzt (Änderungen vor allem in Main-Methode und Konstruktor).
Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
 
public class ShowViewer extends JPanel implements ActionListener{
    
    WohnungVerwalter wohnung = new WohnungVerwalter(); 
    //unnötig Container cp = this.getRootPane();
    String iconsDirectory = "icons/";
    
    int counter; 
 
        
      private JTextField textField1;
      private JTextField textField2;
    
    public ShowViewer(){
        super(); //kann nicht schaden :)
        //super("Wohnung anzeigen");
        
        //unnötig, dies gehört nun zum JFrame ... this.setSize(800,600);      
        // es geht aber: this.setPreferredSize( new Dimension(800, 600) );
        JToolBar toolBar = new JToolBar();
        addButtons(toolBar);
        addTextFelder();
        toolBar.setFloatable(false);
        toolBar.setRollover(true);
        //cp.add(textField1); //wo sollen die Textfelder hin? Auf die Toolbar?
        //cp.add(textField2);

        //unnötig, einmal adden reicht (s.u.) ... this.add(toolBar, BorderLayout.PAGE_START);
        this.add(toolBar, BorderLayout.SOUTH);
        // ...ich habe textField1 und 2 mal nach links und rechts gesetzt...
        this.add(textField1, BorderLayout.WEST);
        this.add(textField2, BorderLayout.EAST);
        
        
        //this.setContentPane(cp);
        //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        //this.add(image);
        //unnötig this.setVisible(true);
        
        
    }   
    
    public void addTextFelder (){
        textField1 = new JTextField();
        textField2 = new JTextField();
        
    }
    
    public void addButtons(JToolBar toolBar) {
        JButton button;
        button = createButton("links", "Zurück" );
        toolBar.add(button);
        button = createButton( "rechts", "Vorwärts" );
        toolBar.add(button);
        button = createButton("blume", "Bearbeiten");
        toolBar.add(button);
        button = createButton("delet", "Löschen");
        toolBar.add(button);
        
 
    }
 
    public JButton createButton(String actionCommand, String toolTipText) {
        String imgLocation = iconsDirectory + actionCommand + ".jpg";
        JButton button = new JButton();
        button.setActionCommand(actionCommand);
        button.setToolTipText(toolTipText);
        button.addActionListener(this);
        button.setIcon(new ImageIcon(imgLocation, actionCommand));
        
        return button;
            
    }
    
    
    
    
       public void showNext() {
            
            counter++;
            
            if (counter>=wohnung.list.size()) counter = 0;
            textField1.setText(wohnung.list.get(counter).getName());
            textField2.setText(wohnung.list.get(counter).getMieterName());
           
        
    }
        public void deleteCurrent(){
            
            String d;
            String s; 
            
            d = (wohnung.list.get(counter).getID());
            //vb.verbinden();
            
            s = "DELETE FROM `mkb`.`vermieter` WHERE `vermieter`.`ID` =" + d;
             
            
            
            
        }
      public void showLast() {
            
            counter--;
            
            if (counter<= 1) //counter = 0;
            textField1.setText(wohnung.list.get(counter).getName());
            textField2.setText(wohnung.list.get(counter).getMieterName());
            
 
        
        
    }
    
    public static void main (String[] args)
    {
        // man kann natürlich seine eigene JFrame-Klasse schreiben und diese hier
        // verwendent
        final JFrame myFrame = new JFrame("Fenstertitel");
        // Layouting des Frames: der ShowViewer ist Hauptkomponente und kommt in die Mitte
        myFrame.add( new ShowViewer(), BorderLayout.CENTER );

        // pack() setzt die Größe des Frames anhand des Inhaltes (daher PreferredSize von ShowViewer setzen
        myFrame.pack(); //oder setSize(800, 600);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // Anzeigen des Frames
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                myFrame.setVisible(true);
            }ab
        });
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().compareTo("rechts") == 0)
            this.showNext();
 
        
    }}
 
Hallo Kroko_Diehl,

Vielen Dank für deine Antwort hat mir sehr viel weitergeholfen, es funktioniert auch sehr gut, musste in deinem Code eine kleinigkeit ändern.

Jetzt habe ich noch mal eine Frage, kann ich ein Gridlayout und ein Borderlayout gleichzeitig verwenden. Statt 2 Textfelder bräuchte ich noch 15- 20 mehr. Oder wäre es besser, allles in einem Gridlayout zu machen.

Dann habe ich noch mal eine andere Frage. Das Panel das du mir geschrieben hast, soll nur nach Klicken eines Buttons angezeigt werden.

Java:
if (evt.getActionCommand().compareTo("wohnung") == 0)
				
					PanelCenter.add(new ShowViewer());

eclipse gibt mir als hilfe eine Klasse anzulegen, den so kann das nicht funktionieren.

Vielen Dank für deine Hilfe!
 
Mal grundsätzlich zu den LayoutManagern:
Grob gesprochen besteht Swing aus Containern und Komponenten. Containern kann man beliebig viele Komponenten zuweisen, aber wie der Container diese anordnet, wird durch den LayoutManager bestimmt. Daher haben nur Container LayoutManager und auch nur genau einen.
Typische Container sind JFrame, JDialog und JPanel.
Ein Container kann aber auch weitere Container enthalten. Ein klassisches Beispiel:
Ein JFrame hat standardmäßig ein BorderLayout. Im NORTH wird eine JToolBar hinzugefügt, im SOUTH eine Statusleiste (z.B. ein JLabel). Im CENTER-Bereich wird dann meistens etwas komplexeres benötigt, sodass man hier einen weiteren Container hinzufügt: sprich ein JPanel.
Dieses JPanel kann man dann wieder aufbauen wie man will.

Zu deinem Fall:
20 und mehr Textfelder kann man wohl tatsächlich am einfachsten und schnellsten in ein GridLayout einfügen. Das folgende Beispiel zeigt einen Frame der im oberen Bereich ein 5*4-Gitter aus Textfeldern hat, im unteren Bereich einen Button. Wenn man diesen klickt, zeigt er deinen ShowViewert im zentralen Bereich an.
Das Ganze ist natürlich nur ein Muster. Mit den Layouting muss man oft herumprobieren, bis man das gewünschte Resultat hat. Es kommt auch oft vor, dass man dafür weitere Container (Panels) anlegen muss, die dann ein eigenes Layouting bekommen.

Java:
class MyApp extends JFrame implements ActionListener
{
    protected ShowViewer viewer = null;

    public MyApp()
    {
        super("Fenstertitel");

        // OBEN
        JPanel topPanel = new JPanel(new GridLayout(5, 4)); //dies ist ein Subcontainer
        for (int i = 0; i < 20; i++
            topPanel.add( new JTextField("Feld Nr."+i) );

        // UNTEN
        JButton btnShow = new JButton("Anzeigen");
        btnShow.addActionListener(this);
        
        // Layouting
        this.add(topPanel, BorderLayout.NORTH);
        this.add(btnShow, BorderLayout.SOUTH);
    
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
    } //konstruktor

    @Override
    public void actionPerformed(ActionEvent event)
    {
        if (viewer == null) //es soll ja nur einmal passieren
        {
            viewer = new ShowViewer();
            this.add(viewer, BorderLayout.CENTER);
            //ggfs ein repaint()
        } 
    } //actionPerformed

    public static void main(String[] args)
    {
        SwingUtilites.invokeLater(new Runnable()
        {
            public void run()
            {
                new MyApp().setVisible(true);
            }
        });
    } //main
} //MyApp

Ich rate dir, entsprechende Swing-Tutorials (zB hier) durchzulesen. Der Aufwand lohnt sich.
 
okay, das hab ich jetzt mal ausprobiert, das Gridlayout möchte ich dann nur in meinem ShowViewer haben, in meiner main GUI werde ich das BorderLayout beibehalten.

Das ist meine MAin_GUI Klasse, in dem Center davon kommt der ShowViewer was schon funktioniert, wo du mir geholfen hast. Jetzt möchte ich lediglich das beim KLicken des "wohnung" Buttons (schon unten im ActionListener zu finden). der ShowViewer in den Center teil gebracht wird. Es geht nur darum das beim klicken des Buttons der Show Viewer in den Center teil des Borderlayouts geschrieben wird.

Mit einem Gridlayout lassen sich dann die Textfelder im ShowViewer viel besser anzeigen, Vielen Dank für dein Beispiel das hat mir alles noch mal ein bisschen verdeutlicht.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Label;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;

public class GUI_Main extends JFrame implements ActionListener{
	

	Container cp = this.getContentPane();
	String iconsDirectory = "icons/";
	protected ShowViewer viewer = null;

	
	String text;

	
	
	public GUI_Main(){
		
		super("EasyMKB");
		
		this.setLayout(new BorderLayout());
		this.setSize(800,600);		
		
		
		//ToolBar
		JToolBar toolBar = new JToolBar("Toolbar");
        
        
        addButtons(toolBar);
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		this.add(toolBar, BorderLayout.NORTH);
		
		//CenterPanel
        JPanel PanelCenter = new JPanel();
       // PanelCenter.add(new ShowViewer());
        
        this.add(PanelCenter, BorderLayout.CENTER);
        
        // WestPanel
        JPanel PanelWest = new JPanel();
        PanelWest.setBackground(Color.WHITE);
        PanelWest.add(new Label("MKB ist ein Tool"));

		this.add(PanelWest, BorderLayout.WEST);
		
		//SouthPanel
		JPanel PanelSouth = new JPanel();
		
		PanelSouth.add(new Label("Easy MKB 2009"));
		
		this.add(PanelSouth, BorderLayout.SOUTH);
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
		
		
	}	
	
	
	
	



	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("neu", "Neue Wohnung anlegen" );
		toolBar.add(button);
		button = createButton( "wohnung", "Wohnungen Anzeigen" );
		toolBar.add(button);
		button = createButton("rechnung", "Rechnungen Anzeigen");
		toolBar.add(button);
		button = createButton("mieter", "Mieter Anzeigen");
		toolBar.add(button);
		button = createButton("benutzer", "Benutzer Anzeigen" );
		toolBar.add(button);
		button = createButton( "statistik", "Statistiken" );
		toolBar.add(button);
		button = createButton("hilfe", "Online Hilfe");
		toolBar.add(button);
		button = createButton("info", "MKB Info");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	

	
	public static void main (String[] args){
		new GUI_Main();		
	}

	@Override
	public void actionPerformed(ActionEvent evt) {
		if (evt.getActionCommand().compareTo("info") == 0)
			try {
				new Info();
			} catch (IOException e) {
				
			}
			
			if (evt.getActionCommand().compareTo("hilfe") == 0)
				try {
					new Hilfe();
				} catch (IOException e) {
					
				}
				
				
				if (evt.getActionCommand().compareTo("wohnung") == 0)
					
			    //if (viewer == null) //es soll ja nur einmal passieren
		        //{
		            viewer = new ShowViewer();
		            this.add(viewer, BorderLayout.CENTER);
		            //repaint();
		        //} 

		
	}}
 
In deinem Bsp. geht das mit dem Hinzufügen des ShowViewers nicht, weil der CENTER-Bereich bereits eine Komponente hat (
Code:
PanelCenter
aus dem Konstruktor).

Du musst entweder diese Komponente im ActionListener zuerst entfernen (mit
Code:
this.remove()
)
ODER
Du lässt den CENTER-Bereich leer bis man eben den Button klickt.
ODER
Du fügst deinen Viewer bereits im Konstruktor in den CENTER-Bereich ein, setzt ihn aber auf unsichtbar (
Code:
viewer.setVisible(false)
). Dann brauchst du ihn im ActionListener nur noch auf sichtbar zu setzen.

In allen Fällen: Wenn man die Änderung nicht sofort sieht, mal ein
Code:
repaint()
Aufrufen, sodass das neue Fenster auch direkt gezeichnet wird.
 
also ich hab es jetzt mal ausprobiert, das der Panel überschrieben wird, denn...das Panel hat am start erst mal ein Bild drin. Also habe ich versucht es mal zu überschreiben wie du es gesagt hast.

Am Konstruktor dürfte sich doch eigentlich garnichts ändern!

Das mit SetVisible finde ich auch zu umständlich, da ich mehrere Klassen beim Klick in das Fenster schreiben möchte. Müsste ich gleich alle KLassen schon mitladen, so wie ich es verstanden habe.

Konstruktor
Java:
public GUI_Main(){
		
		super("EasyMKB");
		
		this.setLayout(new BorderLayout());
		this.setSize(800,600);		
		
		
		//ToolBar
		JToolBar toolBar = new JToolBar("Toolbar");
        
        
        addButtons(toolBar);
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		this.add(toolBar, BorderLayout.NORTH);
		
		//CenterPanel
        JPanel PanelCenter = new JPanel();
       PanelCenter.add(new ShowViewer());
        
        
       this.add(PanelCenter, BorderLayout.CENTER);
        
        // WestPanel
        JPanel PanelWest = new JPanel();
        PanelWest.setBackground(Color.WHITE);
        PanelWest.add(new Label("MKB ist ein Tool"));

		this.add(PanelWest, BorderLayout.WEST);
		
		//SouthPanel
		JPanel PanelSouth = new JPanel();
		
		PanelSouth.add(new Label("Easy MKB 2009"));
		
		this.add(PanelSouth, BorderLayout.SOUTH);
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
		
		
	}

Action....

Java:
if (evt.getActionCommand().compareTo("wohnung") == 0)
					
			    
					//this.remove(PanelCenter);
		            viewer = new ShowViewer();
		            this.add(viewer, BorderLayout.CENTER);
		            repaint();
 
Hallo,

hatte leider die letzten Tage Zeit weiter zu arbeiten, ich bräuchte dann noch mal Hilfe.

ICh habe ein Gridlayout hinzugefügt wie es KrokoDiehl in seinem Beitragen geschrieben hat. Jetzt habe ich nur Probleme den Textfeldern daten mitzugeben.

Java:
JPanel topPanel = new JPanel(new GridLayout(5, 4)); //dies ist ein Subcontainer
        for (int i = 0; i < 25; i++)
            topPanel.add( new JTextField("Feld Nr."+i) );

Wie gebe ich die Inhalte in der Show Next Methode an die TExtfelder weiter?


Java:
public void showNext() {
            
            counter++;
            
            if (counter>=wohnung.list.size()) counter = 0;
            textfield1.setText(wohnung.list.get(counter).getName());
            textField2.setText(wohnung.list.get(counter).getMieterName());


Danke schön
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben