LayoutManager Größe + Positionen?!

T

Tomate_Salat

Gast
Hi,

Ich bezweifel es zwar, aber trotzdem frag ich mal nach: Ich habe eine "buttonbox" mit unbekannter Anzahl an Buttons (ich bestimme nur, dass aus übersichtlichkeitsgründen nur 20 angezeigt werden dürfen). Gibt es einen Layoutmanager, der mir nicht nur die Größe der Buttons, sondern auch die Position dieser festlegt. D.h. wenn nur ein Button da ist, soll der logischerweise groß und füllend sein. Sind z.B. 4 vorhanden sollen die sich wie in einer 2x2 Tabelle anordnen. Zudem sollte ein bestimmtes Größenverhältnis wenn möglich eingehalten werden.

Ich glaube zwar die Antwort zu kennen. Aber der algo hätte es wohl wahrscheinl. echt in sich. Würde das ganze sonst iwie mit Flächen-berechnung versuchen umzusetzen

MFG

Tomate_Salat
 

Michael...

Top Contributor
Wie schaut denn die Anordnungslogik aus? Wie sollen z.B. fünf Objekte angeordnet werden?
Wenn man diese Logik eindeutig beschreiben kann, kann man einen eigenen LayoutManager schreiben, der diese Logik verwendet.
 
T

Tomate_Salat

Gast
Das ist noch ein Problem vor dem Ich stehe. Aber wahrscheinl. dann 3 oben 2 unten

habe die Buttongröße im verhältnis 5:1 [breite:höhe] gehalten und denke mit folgenden formeln hinzukommen:

Fläche gesamt Ages: getWidth() * getHeight(); [von der Buttonbox]
Fläche für Buttons Abtn: Ages / AnzahlButtons
Breite von einem Button: sqrt(Abtn * 5)
Höhe von einem Button: sqrt(Abtn / 5)

Die Problematiken die bleiben:
a) Zwischenräume zwischen den Buttons
b) ist noch nicht fertig getestet

... wer hätte gedacht das Mathe mal wichtig sein würde :D

Edit Ich hab das gefühl ich mache das (nicht zum ersten mal) komplizierter als es ist. Vllt ginge es ja mit einem vorhandenen Layoutmanager, wenn ich auf das Größenverhältnis verzichten würde. Die Buttons sollen erstmal einfach nur die größtmögliche Größe annehmen
 
Zuletzt bearbeitet von einem Moderator:

lumo

Top Contributor
SWT oder Swing?
wenn SWT dann schau dir mal den GridLayout an, bei dem kannst du angeben wieviele spalten du hast... danach wird automatisch gefüllt. du kannst bei den buttons dann mit angeben, per GridData, ob sie füllen sollen oder nicht.
des weiteren kannst du auch angeben ob die spalten die selbe breite haben sollen oder nicht...
 
T

Tomate_Salat

Gast
Swing, SWT hat mich bishere nicht wirklich interessiert, was sich aber gerade eben geändert hat. Werde es mir die nächste zeit mal anschauen, da es zumindest mal, was ich gesehen habe, doch weiter entwickelter ist als Swing...Schon alleine wenn ich sehe wie einfach es ist einen voll funktionsfähigen browser einzubauen ohne auf drittanbieter zurückgreifen zu müssen....Wenn die Tabelle dort einfacher zu händeln sind als in Swing....dann heist es bald byebye SWT :)

aber mal schaun, Swing hat auch ein GridLayout, wäre durchaus schonmal eine vereinfacherung wenn ich erstmal "nur" die Anzahl an spalten herausfinden muss
 

lumo

Top Contributor
ich bin grad am kämpfen mit den tabellen... aber es ist schon mal viel einfacher als in Swing ;)

brauche doch recht viel funktionalität drin... leider :(
 
T

Tomate_Salat

Gast
ja habs mitbekommen^^. Aber wenn ich bedenke, wieviel Kampf ich schon mit Swing hatte...naja, ich muss mal schaun, inwiefern ich da von 0 aus anfangen muss :-!.
kleines OT: Ist es mit SWT einfacher Komponenten Transparent zu machen? Die Transparenz in Swing ist ne katastrophe

Und btw, danke für den Tipp mit GridLayout, hat super funktioniert:

Java:
        int width   = getWidth();
        int height  = getHeight();
        
        // Fläche berechnen
        int A       = width * height;
        
        // SubFläche berechnen       
        int Asub    = A / ANZ;
        
        // Seitenberechnung
        int w       = (int) Math.sqrt(Asub * 5);
        
        // Spalten definieren
        int y       = 1;
        int x       = 1;
        int anz     = ANZ;
        
        while(width > w)
        {
            width -= w;
            y++;
        }        
        
        while(anz > y)
        {
            anz -= y;
            x++;
        }
        
        // Layout definieren
        GridLayout grd  = new GridLayout();
        grd.setColumns(y);
        grd.setRows(x);
        grd.setHgap(5);
        grd.setVgap(5);
        
        setLayout(grd);
        
        // Buttons einfügen
        for(int i = 0; i < ANZ; i++)
        {
            add(new Button( BTNS[i] ));
        }

Edit oder doch nicht...er zeigt mir die Columns total falsch an :-!. Ich sage: 2 Spalten und er macht alles in eine zeile mit x Spalten.
Edit2 muss glaub auch die Zeilen noch berechnen lassen...naja trotzdem ist die Ausgabe dann noch einfacher als wie ichs vorher hatte
Edit3 Ok iwie scheint es zu funktionieren, das Ergbniss ist auf jeden fall verwertbar
 
Zuletzt bearbeitet von einem Moderator:

lumo

Top Contributor
gib mal mehr her, dann helf ich mit!
hab deinen code kopiert, da fehlen aber noch ein paar variablen...
oder erklär was es werden soll... vereinfacht ;)
 

Michael...

Top Contributor
... wer hätte gedacht das Mathe mal wichtig sein würde :D
Mir wurde das fast jede Mathestunde gesagt ;-)

Wenn das Seitenverhältnis fest und Spalten- oder Zeilenanzahl nicht vorgegeben ist und Du den Platz maximal nutzen möchtest hast Du da ja ein Optimierungsproblem, das Du lösen musst. Bei mir ist der Matheunterricht doch schon eine Weile her, daher muss ich ab hier leider passen...
 
T

Tomate_Salat

Gast
Joa hf:

Die ButtonBox
Java:
package comp;

import java.awt.GridLayout;

import javax.swing.JComponent;

public class ButtonBox 
    extends JComponent
{
    // Versionierung
    private static final long serialVersionUID = 1L;

    // Konstanten
    public static int MAX_BUTTONS   = 20;
    
    // Variablen
    private String[] BTNS;
    private int ANZ;
    
    /**
     * Erstellt eine Buttonbox
     * 
     * @param buttons Buttontitles
     */
    public ButtonBox(String... buttons) 
    {               
        // Einträge zählen
        int len = buttons.length;
        
        // Wenn mehr als 20 buttons vorhanden
        if(len > MAX_BUTTONS)        
        {
           System.out.println( "Es können nur " + MAX_BUTTONS + " von " + len + " angezeigt werden");
            len = 20;
        }                
        
        // Speichern
        BTNS    = buttons;
        ANZ     = len;
    }    
    
    public void calcButtonPositions()
    {
        // Resourcen sammeln
        int width   = getWidth();
        int height  = getHeight();
        
        // Fläche berechnen
        int A       = width * height;
        
        // SubFläche berechnen       
        int Asub    = A / ANZ;
        
        // Seitenberechnung
        int w       = (int) Math.sqrt(Asub * 5);
        
        // Spalten definieren
        int y       = 1;
        int x       = 1;
        int anz     = ANZ;
        
        while(width > w)
        {
            width -= w;
            y++;
        }        
        
        while(anz > y)
        {
            anz -= y;
            x++;
        }
        
        // Layout definieren
        GridLayout grd  = new GridLayout();
        grd.setColumns(y);
        grd.setRows(x);
        grd.setHgap(5);
        grd.setVgap(5);
        
        setLayout(grd);
        
        // Buttons einfügen
        for(int i = 0; i < ANZ; i++)
        {
            add(new Button( BTNS[i] ));
        }
    }
}

Die [c]Button[/c]'s sind keine AWT's, sondern selbst geschrieben und der quellcode ist 278 Zeilen lang^^. Ich denke da nimmste einfacher normale JButtons für :p

Mir wurde das fast jede Mathestunde gesagt ;-)

Wenn das Seitenverhältnis fest und Spalten- oder Zeilenanzahl nicht vorgegeben ist und Du den Platz maximal nutzen möchtest hast Du da ja ein Optimierungsproblem, das Du lösen musst. Bei mir ist der Matheunterricht doch schon eine Weile her, daher muss ich ab hier leider passen...

hehe, meiner auch und mein Mathelehrer war en vollidiot. Seine härsteste Aussage:
Matheleherer hat gesagt.:
Ja, das Thema hab ich übersprungen weil ich das langweilig fand
 

lumo

Top Contributor
lol
awt.gridlayout

und ich wunder mich schon, wie du die buttons addest...

hier mal 'n beispiel in SWT
Code:
import org.eclipse.swt.SWT;

public class GRIDD {

	protected Shell shell;

	/**
	 * Launch the application.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			GRIDD window = new GRIDD();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(450, 300);
		shell.setText("SWT Application");

		// spalten
		int ANZ = 5;
		
		// Resourcen sammeln
		int width = shell.getSize().x;
		int height = shell.getSize().y;

		// Fläche berechnen
		int A = width * height;

		// SubFläche berechnen
		int Asub = A / ANZ;

		// Seitenberechnung
		int w = (int) Math.sqrt(Asub * 5);

		// Spalten definieren
		int y = 1;

		while (width > w) {
			width -= w;
			y++;
		}

		// Layout definieren
		GridLayout grd = new GridLayout(y, true);
		shell.setLayout(grd);

		// Buttons einfügen
		for (int i = 0; i < ANZ; i++) {
			Button btn = new Button(shell, SWT.NONE);
			btn.setText("Button "+i);
		}
	}
}
 
T

Tomate_Salat

Gast
lol
awt.gridlayout

und ich wunder mich schon, wie du die buttons addest...

Das ist erstmal auf die Schnelle. Das wird so sicherlich nicht bleiben, da jeder noch einen individuellen MouseListener braucht. Aber im Prinzip funktioniert das schon. Die Buttons sind ne eigene Klasse von mir und haben bereits die notwendigste Konfiguration bekommen.

hier mal 'n beispiel in SWT

Im prinzip das Gleiche wie ichs auch habe, nur sind meine Buttons iwie größer:

abci68d.jpg
 

lumo

Top Contributor
weil ich nicht eingestellt habe, dass er den vollen platz nimmt...

Code:
// Buttons einfügen
		for (int i = 0; i < ANZ; i++) {
			Button btn = new Button(shell, SWT.NONE);
			btn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			btn.setText("Button "+i);
		}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
Yonnig JavaFX Größe von WebView an Content anpassen AWT, Swing, JavaFX & SWT 3
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
L JavaFX AnchorPane an die Größe der Scene oder Window binden? AWT, Swing, JavaFX & SWT 3
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
R Größe von Scene und stage an grid anpassen AWT, Swing, JavaFX & SWT 4
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
J Swing Pane im SplitPane automatische Größe aktivieren AWT, Swing, JavaFX & SWT 0
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
Neumi5694 Größe von Komboboxen neu berechnen AWT, Swing, JavaFX & SWT 3
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
C Größe des Mauszeigers ermitteln AWT, Swing, JavaFX & SWT 5
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
F Gui weicht von Designpreview ab (kein fensterrahmen, andere größe) AWT, Swing, JavaFX & SWT 13
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4
M SWT ScrollPane Größe zu klein AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
W GridBagLayout Größe geben AWT, Swing, JavaFX & SWT 1
S Swing JFrame hat nicht die Größe, die ich eingegeben habe AWT, Swing, JavaFX & SWT 3
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
T Swing Größe des Randes AWT, Swing, JavaFX & SWT 2
C LayoutManager JFrame größe und ausrichtung + Position von Fensterelementen AWT, Swing, JavaFX & SWT 2
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
D SWT Window passt Größe nicht an AWT, Swing, JavaFX & SWT 4
N JPanel größe wissen/festlegen vor dem Anzeigen AWT, Swing, JavaFX & SWT 3
U Größe eines Button im Menü ändern AWT, Swing, JavaFX & SWT 1
G JavaFX Größe der Parentknoten AWT, Swing, JavaFX & SWT 5
R JPanel-Größe verändert sich nicht. Warum? AWT, Swing, JavaFX & SWT 5
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
A JPanel oder GridLayout Größe festsetzten AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
SimonRap Swing JFrame Größe zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Größe der JFrame Decorations herausfinden? AWT, Swing, JavaFX & SWT 4
O Swing Jpanel autom. auf JFrame Größe bringen AWT, Swing, JavaFX & SWT 6
M Swing JLabel mit fester größe nachträglich formatieren AWT, Swing, JavaFX & SWT 2
A JComponent Größe AWT, Swing, JavaFX & SWT 8
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
S Swing TextPane größe beschränken AWT, Swing, JavaFX & SWT 2
R Ellipse2D ändert Größe AWT, Swing, JavaFX & SWT 3
H Swing JButton größe ändern AWT, Swing, JavaFX & SWT 5
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
P JPanel Größe ändern AWT, Swing, JavaFX & SWT 22
I Größe eines rotierten Images AWT, Swing, JavaFX & SWT 3
C Button Größe einstellen klappt nicht (setBounds) AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S Die größe eines JButton ändern AWT, Swing, JavaFX & SWT 7
U feste Größe für den Zeichenbereich eines JFrames AWT, Swing, JavaFX & SWT 4
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
P Tatsächliche Größe für Applet AWT, Swing, JavaFX & SWT 3
C Swing GridBag-Probleme (Größe und Ausrichtung) AWT, Swing, JavaFX & SWT 3
K JFrame Größe ändern AWT, Swing, JavaFX & SWT 4
M jTable - Größe beim Erzeugen AWT, Swing, JavaFX & SWT 4
hdi Swing JFrame Größe ermitteln AWT, Swing, JavaFX & SWT 6
S Swing jFrame auf maximale Größe setzten AWT, Swing, JavaFX & SWT 7
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
I Größe von JPanel ändern AWT, Swing, JavaFX & SWT 6
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
T Die Größe einer JTextArea an Ihren Parent JPanel anpassen. AWT, Swing, JavaFX & SWT 5
L JFrame größe in einem ActionEvent ändern AWT, Swing, JavaFX & SWT 4
G LayoutManager BorderLayout WEST Bereich auf maximale Größe beschränken AWT, Swing, JavaFX & SWT 19
T Inhalt von einem Tab an JTabbedPane größe ausrichten? AWT, Swing, JavaFX & SWT 2
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
S Button Größe - Anfänger AWT, Swing, JavaFX & SWT 13
0 JPanel nicht an größe des JFrames anpassen AWT, Swing, JavaFX & SWT 3
S Swing Größe von JLabels verändern sich in einem Panel unterschiedlich AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben