Bestes Layout für die Toolbar

Status
Nicht offen für weitere Antworten.

alex-t

Aktives Mitglied
welches layout kann man für die toolbar verwenden, sodass der inhalt beim verkleinern des fensters sichtbar bleibt und seine grösse nicht verändert? ich habe das schon in mehreren applets gesehen. die toolbar bekommt da eine art "zeilenumbruch".
 

Catscratch1

Mitglied
Füg das Panel, in dem die Toolbar ist einer JScrollPane zu, dann dürfte es keinen Umbruch mehr geben.
Ich benutze für solche Sachen gerne das BoxLayout. Abstände kann man dann gut über leere Boxen erzeugen!
 
A

alex-t unterwegs

Gast
tut mir leid, ich habe mich unverständlich ausgedrückt. ich möchte so einen zeilenumbruch haben! momentan wird immer nur eine zeile angezeigt und wenn sich das applet verkleiner, wird diese zeile in der darstellung abgeschnitten und nicht umgebrochen. gibt es da eventuell bei netbeans oder jbuilder eine einstellung oä.?
 
M

macfreakz

Gast
Wenn du flexibel sein möchtest, erstelle doch ein eigenes LayoutManager!

Implementiere zuerst das Interface LayoutManager2 oder Layoutmanager und überschreibe die Methoden. Du kannst alles entscheiden, wie die Komponenten sich verhalten sollen. Ist nicht so schwer, gelle?
 

Isaac

Bekanntes Mitglied
macfreakz hat gesagt.:
Wenn du flexibel sein möchtest, erstelle doch ein eigenes LayoutManager!

Implementiere zuerst das Interface LayoutManager2 oder Layoutmanager und überschreibe die Methoden. Du kannst alles entscheiden, wie die Komponenten sich verhalten sollen. Ist nicht so schwer, gelle?


Schon mal einen geschrieben? Ich stelle mir das ziemlich komplex vor. Habs aber noch nie gemacht. Wenn du schon mal einen geschrieben hast poste doch mal quellcode, würde mich mal interesieren wie einfach das ist.
 
B

Beni

Gast
Ich hab mal was ähnliches für eine Toolbar geschrieben. Den Manager müsstest du halt anpassen, aber vielleicht nützts Dir was.

(@Isaac: das ist gar nicht so kompliziert, solange man nicht gerade ein GridBagLayout schreibt...)

Code:
	private class BLayout implements LayoutManager {
		private Dimension[] preferred;
		
		private int getPreferredHeight( int width ){
			Dimension size = new Dimension( width, Integer.MAX_VALUE );
			
			Container parent = BToolbar.this;
			
			int count = parent.getComponentCount();
			if( preferred == null || preferred.length < count )
				preferred = new Dimension[ count ];
			
			for( int i = 0; i < count; i++ )
				preferred[i] = parent.getComponent( i ).getPreferredSize();
			
			int[] breaks = bestRowRatio( parent, preferred, size );
			
			int height = 0;

			for( int i = 0; i < breaks.length; i++ ){
				int max = (i+1<breaks.length) ? breaks[i+1] : preferred.length;
				int maxHeight = 0;
				for( int j = breaks[i]; j<max; j++ ){
					maxHeight = Math.max( maxHeight, preferred[j].height );
				}
				height += maxHeight;
			}
			
			return height;
		}
		
		public Dimension preferredLayoutSize( Container parent ){
			int width = 0;
			int height = 0;
			
			for( int i = 0, n = parent.getComponentCount(); i<n; i++ ){
				Dimension pref = parent.getComponent( i ).getPreferredSize();
				width += pref.width;
				height = Math.max( pref.height, height );
			}
			
			Dimension sizeOf = sizeOf( parent );
			Dimension size = parent.getSize();
			
			return new Dimension( width + size.width - sizeOf.width, 
					height + size.height - sizeOf.height );
		}
		
		
		public void addLayoutComponent(String name, Component comp) {
		}
		
		public Dimension minimumLayoutSize(Container parent) {
			return null;
		}
		
		public void removeLayoutComponent(Component comp) {
		}
		
		private Dimension sizeOf( Container parent ){
			Insets insets = parent.getInsets();
			Dimension size;
			if( insets == null )
				size = new Dimension( parent.getWidth(), parent.getHeight() );
			else{
				size = new Dimension( parent.getWidth() 
					- insets.left - insets.right, parent.getHeight()
					- insets.top - insets.bottom );
			}
			
			size.width = Math.max( 0, size.width - 2*side );
			size.height = Math.max( 0, size.height - 2*side );
			
			return size;
		}
		
		public synchronized void layoutContainer(Container parent) {
			int count = parent.getComponentCount();
			if( preferred == null || preferred.length != count )
				preferred = new Dimension[ count ];
			
			for( int i = 0; i < count; i++ )
				preferred[i] = parent.getComponent( i ).getPreferredSize();
			
			Dimension parentSize = sizeOf( parent );
			int[] breaks = bestRowRatio( parent, preferred, parentSize );
		
			float[] maxHeights = new float[ breaks.length ];
			float[] preferredWidths = new float[ breaks.length ];
			int preferredHeight = 0;
			//int maxWidth = 0;
			
			for( int i = 0; i < breaks.length; i++ ){
				int max = (i+1<breaks.length) ? breaks[i+1] : count;
				for( int j = breaks[i]; j<max; j++ ){
					maxHeights[i] = Math.max( maxHeights[i], preferred[j].height );
					preferredWidths[i] += preferred[j].width;
				}
				preferredHeight += maxHeights[i];
			//	maxWidth = Math.max( maxWidth, preferredWidths[ i ]);
			}
			
			
			float fullHeight = Math.min( parentSize.height, preferredHeight );
			int leftHeight = (int)fullHeight;
			
			int x = side, y = side;
			Insets insets = parent.getInsets();
			if( insets != null ){
				x += insets.left;
				y += insets.top;
			}
			
			int left = x;
			
			for( int i = 0; i < breaks.length; i++ ){
				int max = (i+1<breaks.length) ? breaks[i+1] : count;
				int height = i+1<breaks.length ? Math.round( (maxHeights[ i ] 
						/ preferredHeight) * fullHeight) : leftHeight;
				
				leftHeight -= height;
			
				float fullWidth = Math.min( parentSize.width, preferredWidths[i] );
				int leftWidth = (int)fullWidth;
				
				x = left;
				
				for( int j = breaks[i]; j<max; j++ ){
					int width = j+1<max ? Math.round((preferred[j].width 
							/ preferredWidths[i] ) * fullWidth ): leftWidth;
					leftWidth -= width;
					parent.getComponent( j ).setBounds( x, y, width, height );
					x += width;
				}
				
				y += height;
			
			}
		}
		
		private int[] bestRowRatio( Container parent, Dimension[] preferreds, Dimension containerSize ){
			int rows = 0;
			double oldRatio = 0.0;
			double ratio = Double.POSITIVE_INFINITY;
			int size = preferreds.length;
			
			double fullWidth = 0;
			for( int i = 0, n = preferreds.length; i<n; i++ )
				fullWidth += preferreds[i].width;
			
			do{
				rows++;
				oldRatio = ratio;
				
				double normalWidth = fullWidth / rows;
				double normalHeight = 0;
				double currentWidth = 0;
				double maxWidth = 0;
				double maxHeight = 0;
				
				int index = 0;
				
				for( int i = 0; i<rows; i++ ){
					maxHeight = 0;
					currentWidth = 0;
					
					while( index < size && currentWidth < normalWidth ){
						currentWidth += preferreds[ index ].width;
						maxHeight = Math.max( maxHeight, preferreds[ index ].height );
						
						index++;
					}
					
					maxWidth = Math.max( maxWidth, currentWidth );
					normalHeight += maxHeight;
				}
				
				ratio = Math.abs( Math.min( 0, containerSize.width - maxWidth ) - 
						Math.min( 0, containerSize.height - normalHeight ) );
			}while( ratio < oldRatio );
			rows--;
			
			int[] breaks = new int[ rows ];
			int index = 0;
			double currentWidth = 0;
			double normalWidth = fullWidth / rows;
			
			for( int i = 0; i<rows; i++ ){
				currentWidth = 0;
				breaks[i] = index;
				
				while( index < size && currentWidth < normalWidth ){
					currentWidth += preferreds[ index ].width;
					index++;
				}
			}
			
			return breaks;
		}
	}
 
M

macfreakz

Gast
Code:
import java.awt.*;
import java.util.*;
import javax.swing.*;

public class ResizeLayout 
implements LayoutManager2 
{
    // Unsichtbare Komponenten liegen hier
    private JComboBox cb_otherComp;
    Vector theRest = new Vector();
    
    // Konstruktor
    public ResizeLayout()
    {
        cb_otherComp = new JComboBox();
    }
    
    public void layoutContainer(Container parent) 
    {        
        // Maximale Größe holen
        Dimension maxSize = maximumLayoutSize(parent);
        
        int x=0; // Position X für Komponent
        int y=0; // Position Y für Komponent
        
        // Vektor theRest entleeren
        theRest.clear();

        for(int i=0; i<parent.getComponentCount(); i++)
        {
            Component c = parent.getComponent(i);
            c.setVisible(true);
            
            // Sichtbarkeit prüfen
            if(!c.isVisible())
                continue;
            
            c.setVisible(false);
            
            // Größe ermitteln
            int width = c.getPreferredSize().width;
            int height = c.getPreferredSize().height;

            if((width+x)<maxSize.width)
            {
	            // Komponent Position u. Größe setzen
                c.setVisible(true);
	            c.setBounds(x, y, width, height);
            }
            else
            {
                // Falls notwendig, die unsichtbare Komponenten
                // in die ComboBox stekcen!
                cb_otherComp.setVisible(true);
                
                theRest.add(">>");
                
                for(int z=i; z<parent.getComponentCount(); z++)
                {
                    Component rc = parent.getComponent(z);
                    if(!(rc instanceof JButton))
                        continue;
                    
                    JButton bt = (JButton)rc;
	                theRest.add(bt.getText());
                }
                DefaultComboBoxModel cbm = new DefaultComboBoxModel(theRest);
                cb_otherComp.setModel(cbm);
                parent.add(cb_otherComp);
                cb_otherComp.setBounds(x, y, cb_otherComp.getPreferredSize().width, cb_otherComp.getPreferredSize().height);
                
                // diese Methode verlassen
                return;
            
            }
            
            // position X verschieben für nächste Komponent
            x=x+width;
                
        }
     }

    // Empfohlene Größe ermitteln
    public Dimension preferredLayoutSize(Container parent) 
    {
        Component c = null;
        int width=0; 
        int height=0;
        
        for(int i=0; i<parent.getComponentCount(); i++)
        {
            c = parent.getComponent(i);
            
            if(!c.isVisible())
                continue;
            
            width=width+c.getPreferredSize().width;
            if(height<c.getPreferredSize().height)
                height=c.getPreferredSize().height;
        }
        
        return new Dimension(width, height);
    }
    
    // maximale Größe ermitteln
    public Dimension maximumLayoutSize(Container target) 
    {
        int width = target.getFocusCycleRootAncestor().getWidth();
        int height = preferredLayoutSize(target).height;
        return new Dimension(width, height);
    }
    
    // minimale Größe ermitteln
    public Dimension minimumLayoutSize(Container parent) 
    {
        return preferredLayoutSize(parent);
    }
    
    public void addLayoutComponent(String name, Component comp) 
    {
    }

    public void addLayoutComponent(Component comp, Object constraints) 
    {
    }

    public void removeLayoutComponent(Component comp) 
    {
    }
    
    // Unwichtige Methoden ... 
    public float getLayoutAlignmentX(Container target) 
    {
        return 0;
    }

    public float getLayoutAlignmentY(Container target) 
    {
        return 0;
    }

    public void invalidateLayout(Container target) 
    {
    }
    
    
    // Test main methode zum Testen
    
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("ResizeLayout");
        JPanel toolbar = new JPanel(new ResizeLayout());
        
        toolbar.add(new JButton("Neu..."));
        toolbar.add(new JButton("Bearbeiten"));
        toolbar.add(new JButton("Einstellungen"));
        toolbar.add(new JButton("Hilfe"));
        toolbar.add(new JButton("Forum"));
        toolbar.add(new JButton("Java"));
        toolbar.add(new JButton("Echt grovy?"));
        toolbar.add(new JButton("Praktisch"));
        toolbar.add(new JButton("Aha"));
        toolbar.add(new JButton("Blabla"));
        toolbar.add(new JButton("so funzt!"));
        
        frame.getContentPane().add(toolbar);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setVisible(true);
    }

}

@Isaac: Ja, habe es irgendwo gespeichert! Aber ich habe ein neues für dich extra ganz schnell erstellt, dir zuliebe ;-) Dieses LayoutManager eignet nur zum Toolbar. Es ist etwas schlampig programmiert. Du kannst es optimieren bzw. feilen und Aktionen zum ComboBox hinfügen!

Und noch Fragen???

@Beni: yap! GridBagLayout ist am kompliziersten!!! puh, ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G bestes Look & Feel ? AWT, Swing, JavaFX & SWT 15
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen

Neue Themen


Oben