# Mehrere Bilder auf einmal anzeigen



## moessi91 (6. Nov 2010)

Hallo
das ist mein erster eintrag also ich hoffe ich mache alles richtig. 
Und zwar möchte ich gerne eine unbekannte anzahl an Bildern in einer Tabbed Pane anzeigen lassen. 
Diese Tabbed Pane hat eine Fixe größe (also unveränderbar) die Bilder sollen dann jedenfalls in einem Tab angezeigt werden und egal wie viele es sind. Die Bilder sind in einem Ordner gespeichert. Wenn die seite voll ist soll man mit einer Scrollpane nach unten scrollen können. In welchen Container sollte ich die Bilder da speichern? Ich habe überlegt ob ich eventuell in die Tabbed Pane eine ScrollPane lege und in diese ein Panel in dem ich ein Variables GridLayout (je nach anzahl der Bilder) erzeuge und dieses dann mit JLables fülle wo ich die Bilder hineinspeichere. Dabei hatte ich aber das Problem dass sich das Panel nicht scrollen ließ. Ach ja und unter jedem Bild steht ein kurzer Text. 
Danke jetzt schon für die hilfe.

So wie das Bild unten soll es dann aussehen nur statt den Roten farben dann eben die Bilder.


----------



## eRaaaa (6. Nov 2010)

moessi91 hat gesagt.:


> Ich habe überlegt ob ich eventuell in die Tabbed Pane eine ScrollPane lege und in diese ein Panel in dem ich ein Variables GridLayout (je nach anzahl der Bilder) erzeuge und dieses dann mit JLables fülle wo ich die Bilder hineinspeichere. Dabei hatte ich aber das Problem dass sich das Panel nicht scrollen ließ. Ach ja und unter jedem Bild steht ein kurzer Text.



Also JPanel mit GridLayout + JLabels in ein ScrollPane und dieses wiederum in das TabbedPane hört sich imo recht gut an und sollte funktionieren. Also nicht das ScrollPane in das JPanel, sondern umgekehrt. Wenn du das so meintest, dann könnte das vllt. irgendwie mit dem Layoutmanager zu tun gehabt haben. Du könntest ja mal ein kurzes kompilierbares Beispielprogramm schreiben.
Etwa wie:

```
public static void main(String[] args) throws Exception {
		JFrame frame = new JFrame();
		int rows = 5, cols = 3;
		JPanel panel = new JPanel(new GridLayout(rows, cols, 20, 5));
		Image image = ImageIO.read(new URL("http://www.tixus.de/blog/media/java_duke_mascot.jpg"));
		Icon ico = new ImageIcon(image);
		System.out.println(ico.getIconHeight());
		Border b = BorderFactory.createLineBorder(Color.BLACK);
		for (int i = 0; i < rows; i++) {
			for (int j = 0; j < cols; j++) {
				// oder hier eben nochmal ein jpanel wo dann das
				// jlabel+bildunterschrift reinkommt!
				JLabel l = new JLabel(ico);
				l.setBorder(b);
				panel.add(l);
			}
		}
		JScrollPane scroll = new JScrollPane(panel);
		JTabbedPane tabbedPane = new JTabbedPane();
		tabbedPane.addTab("Hint", scroll);
		JPanel main = new JPanel(new BorderLayout());
		main.add(tabbedPane, BorderLayout.LINE_END);
		frame.add(main);
		frame.setSize(700, 500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
```


----------



## moessi91 (8. Nov 2010)

Danke für die schnelle Antwort habs mir fast genau so vorgestellt  

lg


----------



## moessi91 (17. Nov 2010)

Es ist doch etwas anders als ich es mir gedacht habe. 
Das problem liegt dabei dass im GridLayout alles nur gleich groß sein kann und das Bild definitv größer ist als der Text dazu. Also habe ich mir überlegt das Ganze in eine Table zu schreiben aber irgendwie zeigt es mir nichts an. Hier der Code von dem Frame wo die Bilder Reinkommen und das TableModel:
FRAME: 

```
//======== JFrame_Bilder ========
		JFrame_Bilder = new JFrame();
		JSplitPane_BilderSplit = new JSplitPane();
		JPanel_ButtonPanelBilder = new JPanel();
		JTextField_SearchBild = new JFormattedTextField();
		JButton_BilderSuchen = new JButton();
		JButton_BilderAdd = new JButton();
		JButton_BilderMarkAsSold = new JButton();
		JButton_BilderSchliessen = new JButton();
		JTabbedPane_Bilder = new JTabbedPane();
		JScrollPane_All = new JScrollPane();
		JScrollPane_Gekauft = new JScrollPane();
		JScrollPane_Kommission = new JScrollPane();
		JScrollPane_Sold = new JScrollPane();
		
		JFrame_Bilder.setTitle("Bilder");
		JFrame_Bilder.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		JFrame_Bilder.setVisible(true);
		JFrame_Bilder.setResizable(false);
		Container JFrame_BilderContentPane = JFrame_Bilder.getContentPane();
		JFrame_BilderContentPane.setLayout(null);

		//======== JSplitPane_BilderSplit ========
		{
			JSplitPane_BilderSplit.setDividerLocation(180);

			//======== JPanel_ButtonPanelBilder ========
			{
				JPanel_ButtonPanelBilder.setLayout(null);
				JPanel_ButtonPanelBilder.add(JTextField_SearchBild);
				JTextField_SearchBild.setBounds(0, 0, 180, 30);

				//---- JButton_BilderSuchen ----
				JButton_BilderSuchen.setText("Suchen");
				JButton_BilderSuchen.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JButton_BilderSuchenActionPerformed(e);
					}
				});
				JPanel_ButtonPanelBilder.add(JButton_BilderSuchen);
				JButton_BilderSuchen.setBounds(0, 30, 180, 30);

				//---- JButton_BilderAdd ----
				JButton_BilderAdd.setText("Bild hinzuf\u00fcgen");
				JButton_BilderAdd.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JButton_BilderAddActionPerformed(e);
					}
				});
				JPanel_ButtonPanelBilder.add(JButton_BilderAdd);
				JButton_BilderAdd.setBounds(0, 60, 180, 30);

				//---- JButton_BilderMarkAsSold ----
				JButton_BilderMarkAsSold.setText("Als verkauft markieren");
				JButton_BilderMarkAsSold.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JButton_BilderMarkAsSoldActionPerformed(e);
					}
				});
				JPanel_ButtonPanelBilder.add(JButton_BilderMarkAsSold);
				JButton_BilderMarkAsSold.setBounds(0, 90, 180, 30);

				//---- JButton_BilderSchliessen ----
				JButton_BilderSchliessen.setText("Schlie\u00dfen");
				JButton_BilderSchliessen.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						JButton_BilderSchliessenActionPerformed(e);
					}
				});
				JPanel_ButtonPanelBilder.add(JButton_BilderSchliessen);
				JButton_BilderSchliessen.setBounds(0, 650, 180, 30);

				{ // compute preferred size
					Dimension preferredSize = new Dimension();
					for(int i = 0; i < JPanel_ButtonPanelBilder.getComponentCount(); i++) {
						Rectangle bounds = JPanel_ButtonPanelBilder.getComponent(i).getBounds();
						preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
						preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
					}
					Insets insets = JPanel_ButtonPanelBilder.getInsets();
					preferredSize.width += insets.right;
					preferredSize.height += insets.bottom;
					JPanel_ButtonPanelBilder.setMinimumSize(preferredSize);
					JPanel_ButtonPanelBilder.setPreferredSize(preferredSize);
				}
			}
			JSplitPane_BilderSplit.setLeftComponent(JPanel_ButtonPanelBilder);
			//======== Table in ScrollPane füllen =========
			
			[COLOR="Red"]
                   //Hier sollte eigentlich der Table eingefügt werden. 
                   TableModel model = new TableModel();
			 
		    JTable table = new JTable(model);
		    table.setRowHeight(300);
		    
		    table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
		    JScrollPane_All.add(table);[/COLOR]
			
			//======== JTabbedPane_Bilder ========
			{
				JTabbedPane_Bilder.addChangeListener(new ChangeListener() {
					public void stateChanged(ChangeEvent e) {
						JTabbedPane_BilderStateChanged(e);
					}
				});
				JTabbedPane_Bilder.addTab("Alle", JScrollPane_All);

				JTabbedPane_Bilder.addTab("Gekauft", JScrollPane_Gekauft);

				JTabbedPane_Bilder.addTab("Kommission", JScrollPane_Kommission);

				JTabbedPane_Bilder.addTab("Verkauft", JScrollPane_Sold);

			}
			JSplitPane_BilderSplit.setRightComponent(JTabbedPane_Bilder);
		}
		JFrame_BilderContentPane.add(JSplitPane_BilderSplit);
		JSplitPane_BilderSplit.setBounds(5, 5, 895, 685);

		JFrame_BilderContentPane.setPreferredSize(new Dimension(905, 720));
		JFrame_Bilder.pack();
		JFrame_Bilder.setLocationRelativeTo(JFrame_Bilder.getOwner());
```

Hier ist das Table Model:

```
public class TableModel extends AbstractTableModel
{

	public Object getValueAt(int row, int column) {
	    return "" + (row * column);
	  }
	 
	  public int getColumnCount() {
	    return 4;
	  }
	 
	  public int getRowCount() {
	    return 5;
	  }
	

}

class ImageRenderer extends DefaultTableCellRenderer 
{
	 JLabel lbl = new JLabel();	 

	  ImageIcon icon = new ImageIcon(getClass().getResource("/test.jpg"));
	 
	  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
	    boolean hasFocus, int row, int column) {
	    lbl.setText((String) value);
	    lbl.setIcon(icon);
	    return lbl;
	  }
}
```
Das sind alles nur testdaten die bis jetzt eingespielt werden. Jedenfalls ich komm nicht weiter wenn wer etwas weiß danke schonmal im vorraus 
Ach ja und wenn ich den Code einfach in einer main ausführe und nur den Table mit Scrollpane reingebe gehts aus irgendeinem Grund ???:L ???:L ???:L


----------



## eRaaaa (17. Nov 2010)

Sorry, ich funke quasi mal dazwischen ohne den Code jetzt angeguckt zu haben:


moessi91 hat gesagt.:


> Das problem liegt dabei dass im GridLayout alles nur gleich groß sein kann und das Bild definitv größer ist als der Text dazu.



Schon klar, aber man kann ja Layouts verschachteln. Wenn du da eben nicht dirket JLabels+Text hinzufügst, sondern eben immer JPanels, die dann andere Layouts haben (ich habe das oben eig. schon im Kommentar andeuten wollen) sollte das doch genauso gehen, oder verstehe ich dich falsch?


----------



## moessi91 (17. Nov 2010)

Meinst du also: 
Der ScrollPane in dem Tab, das Panel mit GridLayout hinzufügen dann in jedes Grid wieder ein Panel mit zb.: nullLayout und darein dann 2 lables? einmal mit Bild und einmal mit Text? 
wäre das nicht irgendwie weniger resourcen und vl codeaufwendig mit einem Table?

lg


----------



## eRaaaa (17. Nov 2010)

moessi91 hat gesagt.:


> Meinst du also:
> Der ScrollPane in dem Tab, das Panel mit GridLayout hinzufügen dann in jedes Grid wieder ein Panel mit zb.: nullLayout und darein dann 2 lables? einmal mit Bild und einmal mit Text?


ja so in der Art, null-Layout würde ich jetzt zwar ersetzen mit einem anderen Layout, aber an sich meinte ich das so ja.
Ich habe allerdings auch nicht richtig verstanden was dein genaues Problem in der ersten Variante war. Man kann dem Label ja mit setVerticalTextPosition sagen, dass der Text immer quasi als Bildunterschrift dienen soll ?!



> wäre das nicht irgendwie weniger resourcen und vl codeaufwendig mit einem Table?


mhm, darüber solltest du dir erst Gedanken machen wenn du konkrete Probleme bekommst in der Hinsicht 

Vllt. hat ja auch jmd anderes noch eine ganz andere Idee.... ich wollte halt jetzt nur vermeiden dass du dich jetzt hier mit der Table abfummelst, obwohl die Variante eig. doch funktioniert! Wollte/will dich nicht von deiner Idee abbringen


----------



## moessi91 (18. Nov 2010)

Hab das jetzt doch wieder mit den Labels gemacht weil ich mich einfach nicht entscheiden kann 
Da ist jetzt wieder das Problem dass er mir obwohl ich die Cols des GridLayouts auf 3 spezifiziert habe einfach immer weiter cols macht und keine neuen Rows, außerdem Steht der Text trotz Vertical Alignment bottom wieder neben dem Bild 
hier mal der Code: 

```
int rows = picData.size();
			int cols = 3;
			JPanel panel = new JPanel(new GridLayout(rows, cols, 20, 5));
			Icon ico = null;
		    try {
				ObjectInputStream is = new ObjectInputStream(new FileInputStream(new File("" +
			"D:/Dokumente und Einstellungen/CTK/Desktop/Schule/Java Workspace/Gallerie - Verwaltung/2470VinMös_asdf_asdf")));
				ico = (ImageIcon) is.readObject();
			} catch (FileNotFoundException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			} catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		    System.out.println(ico.getIconHeight());
		    Border b = BorderFactory.createLineBorder(Color.BLACK);
		    for (int i = 0; i < rows*2; i++) 
		    {
		    	for (int j = 0; j < cols; j++) 
		    	{
// oder hier eben nochmal ein jpanel wo dann das
// jlabel+bildunterschrift reinkommt!
		    		JLabel l = new JLabel(ico);
		    		l.setText("Das ist ein Test");
		    		System.out.println(l.getVerticalTextPosition());
		    		l.setVerticalTextPosition(JLabel.BOTTOM);
		    		System.out.println(l.getVerticalTextPosition());
		    		l.setBorder(b);
		    		panel.add(l);
		    	}
		    }
		    JScrollPane_All = new JScrollPane(panel);
```


----------



## eRaaaa (18. Nov 2010)

moessi91 hat gesagt.:


> Da ist jetzt wieder das Problem dass er mir obwohl ich die Cols des GridLayouts auf 3 spezifiziert habe einfach immer weiter cols macht und keine neuen Rows,


versuchs mal mit [c]new GridLayout(0, cols, 20, 5)[/c]


> außerdem Steht der Text trotz Vertical Alignment bottom wieder neben dem Bild



Füge auch mal ein [c]l.setHorizontalTextPosition(JLabel.CENTER);[/c] hinzu !


----------



## moessi91 (27. Nov 2010)

Hab des Problem dank der vielseitigen Hilfen jetzt so gelöst.

```
//Panel in dem die Bilder angezeigt werden. 
			JPanel picPanel = new JPanel();
//Gridlayout für das picPanel erzeugen mit endlos vielen Zeilen und 2 Spalten
			picPanel.setLayout(new GridLayout(0, cols, 20, 10));
		

//Erste schleife = pro Reihe, Zweite schleife ist für die Spalten
		
			for(int j = 0;j < picData.size(); j++)
			{
				System.out.println(j);
				if(picData.get(j).isPicKommission())
				{
					System.out.println("Bilder Frame aufruf: größe des Arrays: "+picData.size());
					String path = picData.get(j).getPicPath();
//Hier wird aus dem Pfad wo das echte Bild liegt der Pfad wo das Skalierte Bild liegt generiert.					
					path = path.substring(20, path.length()-4);
					path = dirInfo.getRelativeShowBase()+path;
					System.out.println("Bilder Frame aufruf: Pfad der anzeige Bilder: "+path);
//FileInputStream					
					FileInputStream fis = null;
//Bilder aus dem Pfad in Stream speichern.					
					try 
					{
						fis = new FileInputStream(path);
					} catch (FileNotFoundException e2) {
						setCode("Error: Konnte File nicht finden!");
						e2.printStackTrace();
					}
//ObjectStream					
					ObjectInputStream ois = null;
//Bild auslesen und Speichern
					try {
						ois = new ObjectInputStream(fis);
					} catch (IOException e2) {
						setCode("Error: Konnte das Bild nicht auslesen!");
						e2.printStackTrace();
					}
//Bild					
					ImageIcon icon = null;
//Bild aus dem OIS auslesen und in icon Speichern.				    
				    try 
				    {
						icon = (ImageIcon) ois.readObject();
					} catch (ClassNotFoundException e1) {
						// 
						e1.printStackTrace();
					} catch (IOException e1) {
						setCode("Error: ungültige Image Datei!");
						e1.printStackTrace();
					}
//idKuenstler, Vorname, Nachname, idBilder, titel, jahr, path, groesse, ekp, vkp, technik sortiert nach Vorname ASC auslesen
//Label mit dem Icon erzeugen					
					JLabel l = new JLabel(icon);
					l.setHorizontalTextPosition(JLabel.CENTER);
			 		l.setVerticalTextPosition(JLabel.BOTTOM);
					l.setVerticalAlignment(JLabel.TOP);
					l.setSize(300, 300);
					l.setFont(new Font("Serif", Font.PLAIN, 14));
					System.out.println("Bilder Frame aufruf: Kommission: "+picData.get(j).isPicKommission());
					l.setName(picData.get(j).getIdPic());
					l.setText("" +
		 				"<html>" +
		 				"<body>" + "<b>"+
		 				"<u>Künstler:</u> "+picData.get(j).getArtistPrename()+" "+picData.get(j).getArtistSurname()+"<br>"+
		 				"<u>Titel:</u> " +picData.get(j).getPicTitle()+"<br>"+
		 				"<u>Technik:</u> "+picData.get(j).getPicTechnik()+"<br>"+
		 				"<u>Jahr:</u> "+picData.get(j).getPicYear()+"<br>"+
		 				"<u>Größe:</u> "+picData.get(j).getPicSize()+"<br>"+
		 				"<u>EKP / VKP:</u> "+picData.get(j).getPicEKP()+" / "+picData.get(j).getPicVKP()+"<br>"+
		 				"</b> </body>" +
		 				"</html>");

					picPanel.add(l);
```

Danke nochmal für die Hilfe :applaus:


----------

