# JTable verwenden



## RealHAZZARD (24. Oktober 2005)

Tach.

  Ich baue gerade ein Programm, in dem eine JTable vorkommen soll.
  Aber ich komm irgendwie nicht so richtig klar. 
  Bei so vielen Ansatzmöglichkeiten blick ich nicht mehr durch...
  die verschiedenen Models, das mit den Renderern usw.:suspekt:

  Ich erklär mal was ich eigentlich vor hab:

  Ich brauche eine Tabelle, die Icons und Text anzeigen soll.
  Sie soll nur zeilenweise anwählbar sein, ein popupmenue pro
  Zeile haben. Sie soll sortierbar sein (nur vom Programm, nicht vom User),
  die Spalten sollen per Doppelklick auf die Größe des größten Eintrag angepasst 
  werden.

  Das ist ja schonmal ein Bißchen was. 
  Welches Model brauche ich da?
  Brauche ich einen Renderer? Wenn ja welchen?
  Und ganz wichtig: Wie verwenden ich das alles?dh.
  Wie komm ich da mal zu nem Ansatz?

  THX


----------



## Snape (24. Oktober 2005)

Moin,
die ganze Welt des JTable möchtest Du in einer Antwort? Respekt. ;-)
--> "Java Swing" von O'Reilly - Erklärt nicht nur die JTable...


----------



## RealHAZZARD (24. Oktober 2005)

Na wieso die ganze Welt?

O'Reilly ist schon prima, aber ich hab was gegen 
englische Bücher. Hab zwar kein Problem mit Englisch
aber ein ganzes Buch? Nein danke.
Ich warte auf die deutsche Übersetzung 
Oder kauf mir ein ähnlich gutes.

Ich will doch nur den Ansatz zur Lösung.
Keinen Lösungskatalog!


----------



## Snape (24. Oktober 2005)

Na dann...

> Welches Model brauche ich da?

Ein eigenes, von DefaultTableModel abgeleitetes empfehle ich.

>  Brauche ich einen Renderer?

Ja.

>Wenn ja welchen?

Einen für die Icons, für den Text reicht der DefaultTableCellRenderer.

>  Und ganz wichtig: Wie verwenden ich das alles?dh.
>  Wie komm ich da mal zu nem Ansatz?

Mach Dich erst mal mit dem TableModel vertraut. Der Renderer wird der ColumnClass zugewiesen und das Popupmenü über einen MouseListener bei der JTable.
Die ganze Vorgehensweise hier zu schildern hieße bei Adam und Eva zu beginnen.
Zu all Deinen Themen bzw. Fragen gibt es hier im Forum verschiedene Beiträge. Einfach


----------



## RealHAZZARD (24. Oktober 2005)

THX
Habe gleich Feierabend. Werd mich morgen damit befassen.
Ich hab schon dannach gesucht. Aber so richtig passendes und 
verständliches hab ich nix gefunden.


----------



## RealHAZZARD (25. Oktober 2005)

Deine Tipps waren richtig gut.

    Soweit bin ich schonmal:

```
import java.awt.Component;
    import java.io.File;
    import javax.swing.Icon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.filechooser.FileSystemView;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;
    
    
    public class Tab {
    	class IconRenderer implements TableCellRenderer
    	{
    		public Component getTableCellRendererComponent(JTable tabelle, 
 		 		 		 		 		Object t, 
 		 		 		 		 		boolean isSelected, 
 		 		 		 		 		boolean hasFocus, 
 		 		 		 		 		int row, 
 		 		 		 		 		int column) 
    		{
 			FileSystemView fsv=FileSystemView.getFileSystemView();// Soll später in einer anderen Funktion stehen
 			Icon ic = fsv.getSystemIcon(new File("eineDatei"));// Soll später in einer anderen Funktion stehen
    			JLabel label = new JLabel(ic);
 			label.setText("Test");// der Text an sich sollte später auch in einer anderen Funktion stehen
    			label.setFont(tabelle.getFont());
    			return label;
    		}
    	}
    
    	public void GUI()
    	{
    		
    		//Icon ic = fsv.getSystemIcon(new File("eineDatei"));
    		JFrame fenster = new JFrame();
    		JScrollPane pane = new JScrollPane();
    		Object[] head=new Object[]
    		{
    			 "Name",
    			 "Pfad",
    			 "Typ",
    			 "Relevanz",
    			 "Größe",
    			 "Datum"
    		};
    		DefaultTableModel model = new DefaultTableModel(head,0);
    		JTable tabelle = new JTable(model);
    		JButton button = new JButton("Mach ma Zeile");
    		fenster.getContentPane().setLayout(null);
    		pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    		pane.setViewportView(tabelle);
    		pane.setSize(300,300);
    		pane.setLocation(0,0);
    		button.setSize(50,25);
    		button.setLocation(0,300);
    		fenster.getContentPane().add(pane);
    		fenster.getContentPane().add(button);
    		fenster.setSize(300,325);
    		fenster.setLocation(200,200);
    		fenster.show();
    		Icon ic=null;
    		Object[] entry=new Object[]
    		{
    			 new File("eineDatei"),
    			 "Da isses",
    			 ".ppp",
    			 "100",
    			 "13525",
    			 "32.54.5646"
    		}; 
    		model.addRow(entry);
    		tabelle.getColumn("Name").setCellRenderer(
    		    		   new IconRenderer()
    					 );
    	}
    	
    	public static void main(String[] args) 
    	{
    		Tab t =new Tab();
    		t.GUI();
    	}
    
    }
```
 _OK...Steht auch noch ein Bisschen was drin,was nicht sein muss,
    abr is ja auch nur ein Testumgebung 
_Jetzt bin ich bei folgendem Problem gelandet:
    Eine Spalte soll ein Icon und einen Text enthalten (wie es oben schon funktioniert).
    Aber ich definiere das Icon ja bisher auch noch im CellRenderer. Das will ich aber 
    später nicht. Selbes gilt für den Text.
    Wie schaffe ich es in ein Object ein Icon und Text zu bringen?


----------



## zerix (25. Oktober 2005)

Ich bin mir nicht ganz sicher, aber das dürfte mit einem JLabel gehen. Also einem JLabel ein Icon und text zuweisen und dann in die Tabelle. Das müsste funktionieren, bin mir aber nicht ganz sicher.


----------



## RealHAZZARD (26. Oktober 2005)

Scheint nicht wirklich zu funktionieren.
 Im Renderer muss ich dann ja da Object an
 ein Label übergeben. Und das geht so weit ich weiß
 schlecht.


----------



## RealHAZZARD (26. Oktober 2005)

Ahh...Sorry für den Post. Es geht
   THX für den Tip


```
import java.awt.Component;
   import java.io.File;
   import javax.swing.Icon;
   import javax.swing.JButton;
   import javax.swing.JFrame;
   import javax.swing.JLabel;
   import javax.swing.JScrollPane;
   import javax.swing.JTable;
   import javax.swing.filechooser.FileSystemView;
   import javax.swing.table.DefaultTableModel;
   import javax.swing.table.TableCellRenderer;
   
   
   public class Tab {
   	class IconRenderer implements TableCellRenderer
   	{
   		public Component getTableCellRendererComponent(JTable tabelle, 
 		 		 		 		 		Object t, 
 		 		 		 		 		boolean isSelected, 
 		 		 		 		 		boolean hasFocus, 
 		 		 		 		 		int row, 
 		 		 		 		 		int column) 
   		{
   			JLabel label=(JLabel)t;
   			return label;
   		}
   	}
   
   	public void GUI()
   	{
   		
  		//Icon ic = fsv.getSystemIcon(new File("datei"));
   		JFrame fenster = new JFrame();
   		JScrollPane pane = new JScrollPane();
   		Object[] head=new Object[]
   		{
   			 "Name",
   			 "Pfad",
   			 "Typ",
   			 "Relevanz",
   			 "Größe",
   			 "Datum"
   		};
   		DefaultTableModel model = new DefaultTableModel(head,0);
   		JTable tabelle = new JTable(model);
   		JButton button = new JButton("Mach ma Zeile");
   		fenster.getContentPane().setLayout(null);
   		pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
   		pane.setViewportView(tabelle);
   		pane.setSize(300,300);
   		pane.setLocation(0,0);
   		button.setSize(50,25);
   		button.setLocation(0,300);
   		fenster.getContentPane().add(pane);
   		fenster.getContentPane().add(button);
   		fenster.setSize(300,325);
   		fenster.setLocation(200,200);
   		fenster.show();
   		//Icon ic=null;
   		
   		FileSystemView fsv=FileSystemView.getFileSystemView();
  		Icon ic = fsv.getSystemIcon(new File("datei"));
   		JLabel label = new JLabel(ic);
   		label.setText("Test");
   		label.setFont(tabelle.getFont());
   		
   		Object[] entry=new Object[]
   		{
  			 label,
   			 "Da isses",
   			 ".ppp",
   			 "100",
   			 "13525",
   			 "32.54.5646"
   		}; 
   		model.addRow(entry);
   		tabelle.getColumn("Name").setCellRenderer(
   		    		   new IconRenderer()
   					 );
   	}
   	
   	public static void main(String[] args) 
   	{
   		Tab t =new Tab();
   		t.GUI();
   	}
   
   }
```


----------



## Snape (26. Oktober 2005)

Moin,
Du kannst übrigens den TableCellRenderer direkt von DefaultTableCellRenderer ableiten oder je nach Bedarf von einer Component. Also extends JPanel o.ä. Hauptsache Du gibst in

getTableCellRendererComponent()

eine Componente (z.B. this in letzterem Fall) zurück.


----------



## RealHAZZARD (26. Oktober 2005)

THX
   Ok. Leuchtet mir alles ein. Aber an einer Stelle steh ich trotzdem aufm
   Schlauch:

```
JLabel label=JLabel(ic);
```
   WIe bringe ich das auf einen Nenner, wenn ich den Renderer das extends JLabel
   anhänge?
   Wenn ich es so schreibe(Was mir ohnehin schon flasch erscheint):

```
this=(JLabel)t;
```
   Kommt das:
_The left-hand side of an assignment must be a variable
_
   Und hier noch mal der ganze Code:

```
import java.awt.Component;
   import java.awt.FlowLayout;
   import java.awt.event.MouseEvent;
   import java.awt.event.MouseListener;
   import java.io.File;
   import javax.swing.Icon;
   import javax.swing.JFrame;
   import javax.swing.JLabel;
   import javax.swing.JScrollPane;
   import javax.swing.JTable;
   import javax.swing.ListSelectionModel;
   import javax.swing.filechooser.FileSystemView;
   import javax.swing.table.DefaultTableModel;
   import javax.swing.table.TableCellRenderer;
   
   
   public class Tab {
   	class IconRenderer extends JLabel implements TableCellRenderer
   	{
   		public Component getTableCellRendererComponent(JTable tabelle, 
 		 		 		 		 		Object t, 
 		 		 		 		 		boolean isSelected, 
 		 		 		 		 		boolean hasFocus, 
 		 		 		 		 		int row, 
 		 		 		 		 		int column) 
   		{
   			this.add((JLabel)t);
   			if (tabelle.getSelectedRow()==row)
   			{
   				
   			}
   			return this;
   		}
   	}
   	
   	public void GUI()
   	{
   		JFrame fenster = new JFrame();
   		JScrollPane pane = new JScrollPane();
   		Object[] head=new Object[]
   		{
   			 "Name",
   			 "Pfad",
   			 "Typ",
   			 "Relevanz",
   			 "Größe",
   			 "Datum"
   		};
   		DefaultTableModel model = new DefaultTableModel(head,0);
   		final JTable tabelle = new JTable(model);
   		fenster.getContentPane().setLayout(new FlowLayout());
   		pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
   		pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
   		pane.setViewportView(tabelle);
   		fenster.getContentPane().add(pane);
   		fenster.setSize(300,325);
   		fenster.setLocation(200,200);
   		tabelle.setAutoResizeMode(tabelle.AUTO_RESIZE_OFF);
   		tabelle.setAutoscrolls(true);
   		tabelle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
   		tabelle.addMouseListener(new MouseListener()
   		{
   			public void mouseClicked(MouseEvent me) {
   				//für den Rechtsklick
 		 	if (me.getButton()==MouseEvent.BUTTON3)System.out.println("jo");
   				//Für den Linksklick
 				if (me.getButton()==MouseEvent.BUTTON1)
   				{
   					
   				}
   			}
   			public void mouseEntered(MouseEvent me) {
 				// TODO Auto-generated method stub
   				
   			}
   			public void mouseExited(MouseEvent me) {
 				// TODO Auto-generated method stub
   				
   			}
   			public void mousePressed(MouseEvent me) {
 				// TODO Auto-generated method stub
   				
   			}
   			public void mouseReleased(MouseEvent me) {
 				// TODO Auto-generated method stub
   				
   			}	
   		});
   		int i=0;
   		tabelle.setShowGrid(false);
   		FileSystemView fsv=FileSystemView.getFileSystemView();
  		Icon ic = fsv.getSystemIcon(new File("datei"));
   		fenster.show();
   		for (;i<32;i++)
   		{
   			JLabel label1 = new JLabel(ic);
   			label1.setText("Test");
   			label1.setFont(tabelle.getFont());
   			JLabel label2 = new JLabel("TestPfad");
   			label2.setFont(tabelle.getFont());
   			JLabel label3 = new JLabel("TestTyp");
   			label3.setFont(tabelle.getFont());
   			JLabel label4 = new JLabel("TestRel"+i);
   			label4.setFont(tabelle.getFont());
   			JLabel label5 = new JLabel("TestGröße");
   			label5.setFont(tabelle.getFont());
   			JLabel label6 = new JLabel("TestDatum");
   			label6.setFont(tabelle.getFont());
   			Object[] entry=new Object[]
   			{
 					label1,
 					label2,
 					label3,
 					label4,
 					label5,
   					label6
   			};
   		model.addRow(entry);
   		}
   		tabelle.getColumn("Name").setCellRenderer(
   		    		   new IconRenderer()
   					 );
   		tabelle.getColumn("Pfad").setCellRenderer(
   				   new IconRenderer()
   				 );
   		tabelle.getColumn("Typ").setCellRenderer(
   				   new IconRenderer()
   				 );
   		tabelle.getColumn("Relevanz").setCellRenderer(
   				   new IconRenderer()
   				 );
   		tabelle.getColumn("Größe").setCellRenderer(
   				   new IconRenderer()
   				 );
   		tabelle.getColumn("Datum").setCellRenderer(
   				   new IconRenderer()
   				 );
   		
   	}
   	
   	public static void main(String[] args) 
   	{
   		Tab t =new Tab();
   		t.GUI();
   	}
   }
```


----------



## Snape (26. Oktober 2005)

Hi,
also ich verstehe das im Renderer nicht:

this.add((JLabel)t);

Der Renderer ist doch schon ein JLabel, also höchstens

this.setIcon() oder this.setText() in der Art.


----------



## RealHAZZARD (27. Oktober 2005)

Aber das ist ja das Problem.
Der Renderer bekommt ja schon ein Label.
Und das weil in der ersten Column 2 Objekte stehen
müssen. Ein Icon und Text.


----------



## Snape (27. Oktober 2005)

Moin,
dann eignet sich ... extends JLabel nicht. 
Ein JPanel mit einem JLabel für das Icon und einem JLabel oder JTextField für den Text bieten sich eher an.


----------

