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
		
	}}
 

KrokoDiehl

Top Contributor
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.
 

maxth

Aktives Mitglied
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?
 

KrokoDiehl

Top Contributor
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.
 

maxth

Aktives Mitglied
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) {
		

		
	}}
 

maxth

Aktives Mitglied
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:

KrokoDiehl

Top Contributor
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).
 

maxth

Aktives Mitglied
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();

		
	}}
 

KrokoDiehl

Top Contributor
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();
 
        
    }}
 

maxth

Aktives Mitglied
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!
 

KrokoDiehl

Top Contributor
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.
 

maxth

Aktives Mitglied
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();
		        //} 

		
	}}
 

KrokoDiehl

Top Contributor
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.
 

maxth

Aktives Mitglied
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();
 

maxth

Aktives Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JMenuBar und JToolBar Anzeige Probleme AWT, Swing, JavaFX & SWT 5
kaoZ Swing JToolBar, ImageIcon werden teilweise verdeckt AWT, Swing, JavaFX & SWT 0
U JToolbar resizable o. Ä. AWT, Swing, JavaFX & SWT 3
kaoZ Swing JToolBar AWT, Swing, JavaFX & SWT 13
U JToolBar Button nicht fokussieren AWT, Swing, JavaFX & SWT 2
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
Landei Swing JToolbar: Textfelder mit normaler Höhe? AWT, Swing, JavaFX & SWT 2
P Swing JComoBox auf JToolBar AWT, Swing, JavaFX & SWT 4
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
I Swing Optik eines JButton an JToolBar anpassen AWT, Swing, JavaFX & SWT 5
S Drag wie bei JToolbar mit JPanel AWT, Swing, JavaFX & SWT 3
H Swing Den Button einer JToolBar gedrückt halten AWT, Swing, JavaFX & SWT 9
S Hintergrundfarbe in JToolbar nicht angezeigt AWT, Swing, JavaFX & SWT 2
C JToolbar in JTable AWT, Swing, JavaFX & SWT 4
R JMenu in JToolBar AWT, Swing, JavaFX & SWT 6
O Button auf JToolBar rechtsbündig AWT, Swing, JavaFX & SWT 2
A JToolbar lässt sich aus dem Fenster lösen AWT, Swing, JavaFX & SWT 2
E JToolBar ausrichten AWT, Swing, JavaFX & SWT 2
J Swing JToolBar Button mit Icon AWT, Swing, JavaFX & SWT 4
J JToolBar AWT, Swing, JavaFX & SWT 2
M JToolbar nebeneinander? AWT, Swing, JavaFX & SWT 3
H JToolBar Rollover AWT, Swing, JavaFX & SWT 2
D JtoolBar feste Breite ? AWT, Swing, JavaFX & SWT 13
G Icon ans Ende einer JToolbar AWT, Swing, JavaFX & SWT 7
B Toolbar, Toolbar In Toolbar, alterna zu JToolbar AWT, Swing, JavaFX & SWT 3
G JToolBar - addSeparator() funktioniert nicht AWT, Swing, JavaFX & SWT 3
G JToolBar Separator AWT, Swing, JavaFX & SWT 6
C JToolBar ein/ausblenden AWT, Swing, JavaFX & SWT 6
W JToolBar - wohin damit? AWT, Swing, JavaFX & SWT 4
Noar Problem mit Hinzufügen von JToolBar AWT, Swing, JavaFX & SWT 2
G JToolbar gleich als eigenes Fenster öffnen AWT, Swing, JavaFX & SWT 2
A JToolBar: Welcher Button wurde gedrückt? AWT, Swing, JavaFX & SWT 5
A JToolBar: Buttonbreite festlegen AWT, Swing, JavaFX & SWT 7
M Problem mit JComboBox in JToolBar AWT, Swing, JavaFX & SWT 3
padde479 Mehrere JToolBar setzen AWT, Swing, JavaFX & SWT 2
A Hintergrundfrabe eines JButtons innerhalb eines JToolBar AWT, Swing, JavaFX & SWT 4
G JButton wie in JToolBar AWT, Swing, JavaFX & SWT 7
vogella JToolBar mit JTextField - Größe des Text Feldes festlegen AWT, Swing, JavaFX & SWT 2
C JToolBar nicht minimieren beim Minimieren des Eltern-Frames AWT, Swing, JavaFX & SWT 4
S Mehere Componenten setEnabled(false) in JToolBar AWT, Swing, JavaFX & SWT 4
S JToolBar und JTabbedPane AWT, Swing, JavaFX & SWT 2
B scrollbare jtoolbar sobald fenster zu klein wird AWT, Swing, JavaFX & SWT 5
B floating jtoolbar von programmstart an? AWT, Swing, JavaFX & SWT 4
B JToolBar Button größe AWT, Swing, JavaFX & SWT 10
I Button in JToolbar gleich groß AWT, Swing, JavaFX & SWT 2
I Hat jemand eine JToolBar? AWT, Swing, JavaFX & SWT 4
A Vertikaler JSeparator in einer JToolbar AWT, Swing, JavaFX & SWT 2
A JToolBar nur oben andockbar machen - wie? AWT, Swing, JavaFX & SWT 6
M Gruppierungen in JToolbar AWT, Swing, JavaFX & SWT 3
T Mehrere Fragen zu JToolBar AWT, Swing, JavaFX & SWT 2
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen

Neue Themen


Oben