Java Swing - GridBagLayout - Komponenten feste Größe

Crashdowns

Ensign
Registriert
Juni 2010
Beiträge
138
Einen schönen guten Tagen zusammen,
ich arbeite mich momentan in das Thema Java und GUI ein.

Ich habe ein ScrollPanel erstellt und füge auf diesem per for-Schleife JPanels (mit unterschiedlich langen JLabels drin) mit einer Border ein. Leider ist es mir bis jetzt nicht gelungen das diese JPanels alle die selbe Größe haben was etwas unschön aussieht (siehe Anhang).

Ich hab jetzt schon sehr lange diverse Optionen des GridBagLayout ausgetestet und ausprobiert aber leider noch keine Lösung gefunden. Hat jmd. von euch eine Idee?

Mit freundlichen Grüßen
Crash

PS: Hier ein Code Ausschnitt

PHP:
	private static void initSingleStockPanel(int counter) throws IOException{
		try{
			singleStockPanel = new JPanel();
			singleStockPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		
			ArrayList<String> symbolListe = getListe();
			ArrayList<String> companyListe =getListe();
			stock =symbolListe.get(counter) +".csv";
			String stockPathAndFormat = stockPath + stock;
			ArrayList<String> stockListe = getListe();
			stockPrice = stockListe.get(0);
		
			//---------------------------------------------------------------------------
			//Layout
			GridBagLayout gbl = new GridBagLayout();
			singleStockPanel.setLayout(gbl);
		
			GridBagConstraints gbc = new GridBagConstraints();
			//Abstände der elemente zum GUI netzwerk
			gbc.insets = new Insets(1,1,1,1);


			//---------------------------------------------------------------------------
			//create all elements
			symbolLabel = new JLabel(symbolListe.get(counter));
			nameLabel   = new JLabel(companyListe.get(counter));
			priceLabel  = new JLabel(stockPrice + " $");
			picLabel = new (hier kommt ein chart her);
			//testLabel
			priceAenderungLabel = new JLabel (AenderungAktienZuVortag.aenderungZuVortag(stockListe)+ " %");
		
			//add Labels to Panel
			gbc.gridx = 0;
			gbc.gridy = 0;
			gbc.ipadx = 25;
			gbl.setConstraints(symbolLabel, gbc);
			singleStockPanel.add(symbolLabel);
		
			gbc.gridx = 7;
			gbc.gridy = 0; 
			gbc.gridheight = 1;
			//gbc.gridwidth  = 9;
			gbl.setConstraints(priceLabel, gbc);
			singleStockPanel.add(priceLabel);
		
			gbc.gridx = 13;
			gbc.gridy = 0;
			gbc.ipadx = 15;
			gbl.setConstraints(priceAenderungLabel, gbc);
			singleStockPanel.add(priceAenderungLabel);
		
			gbc.gridx = 24;
			gbc.gridy = 0;
			gbc.gridheight = 1;
			gbc.gridwidth  = 7;
			gbc.anchor = GridBagConstraints.LINE_END;
			gbl.setConstraints(nameLabel, gbc);
			singleStockPanel.add(nameLabel);
		
		}
		catch (Exception e){
			
		}
		
	}
	
	private static void initStockScrollPane() throws IOException{
		JPanel outerPanel = new JPanel();
		
		GridBagLayout gbl = new GridBagLayout();
		outerPanel.setLayout(gbl);
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets= new Insets(1,1,1,1);
		
		//add the stockPanels
		for(int i = 0; i < 100; i++){
			//koordinaten festlegen
			gbc.gridx = 0;
			gbc.gridy = i * 10;
			//panel fuer eine aktie erzeugen
			initSingleStockPanel(i);
			//hinzfuegen
			gbl.setConstraints(singleStockPanel,gbc);
			outerPanel.add(singleStockPanel);
		}
		stockScrollPane = new JScrollPane(outerPanel);
	}
 

Anhänge

  • error.png
    error.png
    56,3 KB · Aufrufe: 570
Zuletzt bearbeitet:
1. In eine ScrollPane gehört nur ein Element
2. Kein Anhang
3. Kein Code

Fazit: Hilfestellung nicht möglich
 
Also, falls es dir nur um das Ergebnis geht:
Erzeuge eine JList, gebe im Konstruktor die Texte der JLabels an, und stecke sie in eine JScrollPane.

Falls du jedoch genau dieses Aussehen wie oben, sprich mit Border, erreichen willst, dann würde ich wie folgt vorgehen:
- JPanel mit GridLayout (GridBagLayout ist zwar mächtiger, in diesem Fall aber völlig oversized)
- JPanel mit JLabels füllen (Denen halt den Text und eine Border zuweisen)
- JPanel in eine JScrollPane packen
 
Warum sind die Methoden statisch?

Das deine einzelnen SingleStockPanels unterschiedlich groß sind, ist kein Wunder. Sie haben jedes ein eigenes Layout und das ist vom Inhalt abhängig. Jetzt könnte man feste Größen verwenden, das ist aber auch eine eher schlechte Idee. Und wieso werden deine einzelnen Elemente an Position 0, 7, 13 und 24 eingefügt? Um einen Abstand dazwischen zu schaffen? Dafür gibt es andere Möglichkeiten (z.B. GridBagConstraints.insets).

Für solche Daten wäre eine Tabelle IMHO sowieso besser geeignet. Da kann man dann auch ohne großen Programmieraufwand sortieren, suchen und einzelne Datensätz einfügen oder löschen.
 
JTable wäre hier wohl das passende Widget...

Kleiner Tipp am Rande: Die Layout-Manager der Runtime sind nicht gerade die Offenbarung. Natürlich sollte man sich einmal damit beschäftigt haben, aber es gibt bessere Alternativen, namentlich MigLayout. Wobei Swing mittlerweile eher als Legacy-Toolkit angesehen werden darf. MigLayout unterstützt dankenswerterweise auch SWT und JavaFX.
 
@rille
Und wieso werden deine einzelnen Elemente an Position 0, 7, 13 und 24 eingefügt?
ich hatte eher die hoffnung das die JLabel sich bis zu dieser Grenze dann ausbreiten. Den Abstand wollte ich damit nicht beeinflussen.
Die Implementation als Liste wäre suboptimal, weil dort noch charts eingefügt werden.
 

Ähnliche Themen

Zurück
Oben