Swing IllegalStateException

Orothred

Mitglied
Moin,

ich versuche gerade Labels dynamisch beim Laden eines Fenstern zu erzeugen, benutze dafür eine HashMap.

Hier mal mein aktueller Code (das ganze GroupLayout-Zeug is generierter Code vom Designer):

Java:
package gui;

import java.awt.Cursor;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import rankingEngine.QueryResult;
import javax.swing.JLabel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Color;

public class ResultWindow extends javax.swing.JFrame
{
	
	
	List<QueryResult> list;
	
	public ResultWindow(List<QueryResult> list)
	{
		getContentPane().setBackground(Color.WHITE);		
		//this.list = list;
		QueryResult result = new QueryResult();
		result.setUrl("www.google.de");
		result.setTitle("Google");
		list.add(result);		
		result.setUrl("www.wikipedia.de");
		result.setTitle("Wikipedia");
		list.add(result);
		
		GroupLayout groupLayout = new GroupLayout(getContentPane());
		
		int counter = 0;
		HashMap<Integer,JLabel> map = new HashMap<Integer,JLabel>();
		
		for(QueryResult item: list)
		{
			final String strURL = item.getUrl();
			
			
		    JLabel label = new JLabel("<html><body><a href="+item.getUrl()+">"+item.getTitle()+"</a></body></html>");
		    map.put(counter, label);
	    	map.get(counter).setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		    map.get(counter).addMouseListener(new MouseAdapter()
		    {
		        @Override
		        public void mouseClicked(MouseEvent e)
		        {
		           if (e.getClickCount() > 0)
		           {
		               // Browseraufruf (für Windows):
		               try
			           {
			               Runtime.getRuntime().exec("cmd.exe /c start "+strURL);
			           }
		               catch (IOException e1)
		               {
			               // TODO Auto-generated catch block
				           e1.printStackTrace();
			           }
		           }
		         }
		    });
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(20)
					.addComponent(map.get(counter), GroupLayout.PREFERRED_SIZE, 388, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(26, Short.MAX_VALUE))
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addContainerGap()
					.addComponent(map.get(counter))
					.addContainerGap(237, Short.MAX_VALUE))
		);
		getContentPane().setLayout(groupLayout);
		
		counter++;
		}
	}
	
	
	public static void main(String[] args)
	{
		List<QueryResult> list = new ArrayList<QueryResult>();
		
		ResultWindow window = new ResultWindow(list);
		window.setVisible(true);
	}
}

Bei
Java:
window.setVisible(true);

schmeißt er mir dann ne IllegalStateException. Kann mir da grad keinen Reim drauf machen, vielleicht könnt ihr mir weiterhelfen?

Danke schonmal :)
 

bERt0r

Top Contributor
Mit jedem schleifendurchlauf erstellst du ein neues Layout und überschreibst das alte, das heißt auch wenn du keinen Fehler bekommen würdest, würde nur ein item angezeigt.
Was du vorhast funktioniert mit dem Grouplayout allerdings bestens:
Du erstellst dir eine horizontal und eine vertical group und merkst sie dir (Variable). In der Schleife fügst du zu den groups dann jeweils die Labels und eventuell noch weitere Groups je nach layout und nach der Schleife machst du setVerticalGroup und setHorizontalGroup

Und hier noch kurz ein Beispiel wie sowas aussehen kann:
Java:
public class BlogEntryListPanel extends JPanel
{
	
	private static final long serialVersionUID = 1L;
	private SequentialGroup vGroup;
	private ParallelGroup hGroup;
	private MainFrame parent;
	
	/**
	 * creates a new panel for all blog entries a blog has
	 * 
	 * @param p contains the MainFrame where the user will be redirected to
	 *            later on
	 */
	public BlogEntryListPanel(MainFrame p)
	{
		this.parent = p;
		GroupLayout layout = new GroupLayout(this);
		vGroup = layout.createSequentialGroup();
		hGroup = layout.createParallelGroup(Alignment.CENTER);
		
		layout.setVerticalGroup(vGroup);
		layout.setHorizontalGroup(hGroup);
		this.setLayout(layout);	
	}
	
	/**
	 * adds a blog entry to the blog entry panel
	 * 
	 * @param entry contains the blog entry which the user wants to add
	 */
	public void addBlogEntry(BlogEntry entry)
	{
		BlogEntryPanel entryPanel = new BlogEntryPanel(entry);
		
		vGroup.addComponent(entryPanel);
		hGroup.addComponent(entryPanel);
		revalidate();
	}
	
	/**
	 * resets the panel
	 */
	public void reset()
	{
		this.removeAll();
		revalidate();
	}
	
}
 
Zuletzt bearbeitet:


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Oben