Anfänger: Layoutproblem !

Status
Nicht offen für weitere Antworten.

sunnyfriday

Aktives Mitglied
hallo Leute,

habe ein kleines Problem!!

Ich versuche ein Layout zu erstellen. Habe allerdings Probleme dass so zu machen, wie ich es will.

Wiefolgt möchte ich es realisieren.

Mein JFrame hat das Borderlayout.

Auf BorderLayout.NORTH kommt eine Toolbar.
Auf BorderLayout.WEST kommt ein JPanel.
Auf BorderLayout.CENTER kommt ein JPanel mit Cardlayout.
Auf Auf BorderLayout.SOUTH kommt eine JTextArea.

Soweit sogut.
Ich möchte aber im Bereich BorderLayout.SOUTH über der TextArea einen Button "refresh" platzieren.
der button soll aber nicht die komplette breite beanspruchen. Lediglich links über dem TextArea erscheinen.

Habe gedacht ich könnte es so machen, dass ich
Code:
        // initialize textarea
        this.textArea = new JTextArea(10,25);
        JScrollPane scrollPane = new JScrollPane(this.textArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("Text area"));
        
        JPanel footer = new JPanel();
        footer.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        footer.add(new JButton("refresh"));
        footer.add(scrollPane);
        
        getContentPane().add(footer,BorderLayout.SOUTH);
funktioniert aber nicht.

Wie kann ich das Problem am besten lösen?

Der komplette Code
Code:
package gui;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class Gui extends JFrame{

	private static final long serialVersionUID = 1L;
	
    private JPanel leftpanel;
    CardLayout cl = new CardLayout();
    JPanel panel = new JPanel(cl); 
    JTextArea textArea;
    
	/**
	 * This is the default constructor
	 */
	public Gui() {
	
	    //left
		leftpanel = new JPanel();
		leftpanel.setPreferredSize(new Dimension(200, 150));
		
		//create start panel
		JPanel blankPanel = new JPanel();
        blankPanel.add(new JLabel("Center"));
        blankPanel.setBorder(BorderFactory.createTitledBorder("Data Editor"));
        panel.add(blankPanel, "HOME");
     
        // initialize gui
        this.setSize(800, 600);
        this.getContentPane().setLayout(new BorderLayout());
            
        JButton addButton = new JButton(new ImageIcon("images/new.png")); 
        JToolBar toolbar = new JToolBar(); 
        toolbar.add(addButton);
          
        this.getContentPane().add(toolbar, BorderLayout.NORTH);
        this.getContentPane().add(leftpanel,BorderLayout.WEST);
        this.getContentPane().add(panel,BorderLayout.CENTER);
       
        // initialize textarea
        this.textArea = new JTextArea(10,25);
        JScrollPane scrollPane = new JScrollPane(this.textArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("NDEF Message"));
        
        JPanel footer = new JPanel();
        footer.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        footer.add(new JButton("refresh"));
        footer.add(scrollPane);
        
        getContentPane().add(footer,BorderLayout.SOUTH);
        cl.show(panel, "HOME");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Gui thisClass = new Gui();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});		
	}


}

danke für eure hilfe!

sunny
 
Eine mögliche, aber nicht gerade tolle Variante wäre, noch ein JPanel zu erzeugen, das ein BorderLayout besitzt.
Dem fügst du dann in WEST deinen Button hinzu und das Panel fügst du deinem footer Panel hinzu.
 
Es gibt, denke ich, 2 praktikable Lösungen:

1. Du erzeugst ein JPanel mit BorderLayout. In den Center-Bereich setzt du deine JTextArea. In den North-Bereich setzt du ein weiteres JPanel mit FlowLayout. Im Konstruktor des JPanels gibst du das Argument für die Ausrichtung der Components an.
Code:
super(new FlowLayout(FlowLayout.LEFT)); //wenn du von JPanel erbst
oder
Code:
panel.setLayout(new FlowLayout(FlowLayout.LEFT)); //wenn du ein JPanel instanziierst

2. Lösungsmöglichkeit: Mit GridBagLayout, weiter unten gibts ein Codebeispiel.

getContentPane() brauchst du seit Java 1.5 nicht mehr benutzen. Du kannst die Komponenten direkt der add()-Methode übergeben.
________________________________________________________________________________________________


Für Variante 1 habe ich mal 4 Zeilen hinzugefügt:
Code:
package gui;

import java.awt.*;
import javax.swing.*;

public class Gui extends JFrame{

   private static final long serialVersionUID = 1L;

    private JPanel leftpanel;
    private CardLayout cl = new CardLayout();
    private JPanel panel = new JPanel(cl);
    private JTextArea textArea;

   /**
    * This is the default constructor
    */
   public Gui() {

       //left
      leftpanel = new JPanel();
      leftpanel.setPreferredSize(new Dimension(200, 150));

      //create start panel
      JPanel blankPanel = new JPanel();
        blankPanel.add(new JLabel("Center"));
        blankPanel.setBorder(BorderFactory.createTitledBorder("Data Editor"));
        panel.add(blankPanel, "HOME");

        // initialize gui
        this.setSize(800, 600);
        this.setLayout(new BorderLayout());

        JButton addButton = new JButton(new ImageIcon("images/new.png"));
        JToolBar toolbar = new JToolBar();
        toolbar.add(addButton);

        this.add(toolbar, BorderLayout.NORTH);
        this.add(leftpanel,BorderLayout.WEST);
        this.add(panel,BorderLayout.CENTER);

        // initialize textarea
        this.textArea = new JTextArea(10,25);
        JScrollPane scrollPane = new JScrollPane(this.textArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("NDEF Message"));

        JPanel footer = new JPanel(new BorderLayout());
        //footer.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        JPanel footerOptions = new JPanel(new FlowLayout(FlowLayout.LEFT));
        footerOptions.add(new JButton("refresh"));
        footer.add(footerOptions, BorderLayout.NORTH);
        footer.add(scrollPane, BorderLayout.CENTER);

        this.add(footer,BorderLayout.SOUTH);
        cl.show(panel, "HOME");
   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            Gui thisClass = new Gui();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
         }
      });
   }
}

Variante 2 mit GridBagLayout sieht dann so aus:
Code:
package gui;

import java.awt.*;
import javax.swing.*;

public class Gui extends JFrame{

   private static final long serialVersionUID = 1L;

    private JPanel leftpanel;
    private CardLayout cl = new CardLayout();
    private JPanel panel = new JPanel(cl);
    private JTextArea textArea;

   /**
    * This is the default constructor
    */
   public Gui() {

       //left
      leftpanel = new JPanel();
      leftpanel.setPreferredSize(new Dimension(200, 150));

      //create start panel
      JPanel blankPanel = new JPanel();
        blankPanel.add(new JLabel("Center"));
        blankPanel.setBorder(BorderFactory.createTitledBorder("Data Editor"));
        panel.add(blankPanel, "HOME");

        // initialize gui
        this.setSize(800, 600);
        this.setLayout(new BorderLayout());

        JButton addButton = new JButton(new ImageIcon("images/new.png"));
        JToolBar toolbar = new JToolBar();
        toolbar.add(addButton);

        this.add(toolbar, BorderLayout.NORTH);
        this.add(leftpanel,BorderLayout.WEST);
        this.add(panel,BorderLayout.CENTER);

        // initialize textarea
        this.textArea = new JTextArea(10,25);
        JScrollPane scrollPane = new JScrollPane(this.textArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("NDEF Message"));

        JPanel footer = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        //footer.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(5, 5, 2, 0);
        footer.add(new JButton("refresh"), gbc);

        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.insets = new Insets(0, 0, 0, 0);
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        footer.add(scrollPane, gbc);

        this.add(footer, BorderLayout.SOUTH);
        cl.show(panel, "HOME");
   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            Gui thisClass = new Gui();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
         }
      });
   }
}
 
hallo,

danke für die antworten.

habe es jetzt so gemacht wie dein erster Vorschlag. funktioniert!!!
danke!!!

Code:
package gui;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class Gui extends JFrame{

	private static final long serialVersionUID = 1L;
	
    private JPanel leftpanel;
    CardLayout cl = new CardLayout();
    JPanel panel = new JPanel(cl); 
    JTextArea textArea;
    
	/**
	 * This is the default constructor
	 */
	public Gui() {
	
	    //left
		leftpanel = new JPanel();
		leftpanel.setPreferredSize(new Dimension(200, 150));
		
		//create start panel
		JPanel blankPanel = new JPanel();
        blankPanel.add(new JLabel("Center"));
        blankPanel.setBorder(BorderFactory.createTitledBorder("Data Editor"));
        panel.add(blankPanel, "HOME");
     
        // initialize gui
        this.setSize(800, 600);
        this.getContentPane().setLayout(new BorderLayout());
            
        JButton addButton = new JButton(new ImageIcon("images/new.png")); 
        JToolBar toolbar = new JToolBar(); 
        toolbar.add(addButton);
          
        this.getContentPane().add(toolbar, BorderLayout.NORTH);
        this.getContentPane().add(leftpanel,BorderLayout.WEST);
        this.getContentPane().add(panel,BorderLayout.CENTER);
       
        // initialize textarea
        this.textArea = new JTextArea(10,25);
        JScrollPane scrollPane = new JScrollPane(this.textArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("NDEF Message"));
        
        JPanel footer = new JPanel();
        footer.setLayout(new BorderLayout());
       
        footer.add(scrollPane, BorderLayout.CENTER);
        JPanel footer2 = new JPanel();
        footer2.setLayout(new FlowLayout(FlowLayout.LEFT));
        footer2.add(new JButton("Hallo"));
        
        footer.add(footer2, BorderLayout.NORTH);
         
   
        
        getContentPane().add(footer,BorderLayout.SOUTH);
        cl.show(panel, "HOME");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Gui thisClass = new Gui();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});		
	}


}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben