JTable verwenden

RealHAZZARD

Erfahrenes Mitglied
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
 
Moin,
die ganze Welt des JTable möchtest Du in einer Antwort? Respekt. ;-)
--> "Java Swing" von O'Reilly - Erklärt nicht nur die JTable...
 
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!
 
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 :suchen:
 
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.
 
Deine Tipps waren richtig gut.

Soweit bin ich schonmal:
Code:
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?
 
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.
 
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.
 
Ahh...Sorry für den Post:-). Es geht
THX für den Tip

Code:
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();
   	}
   
   }
 
Zuletzt bearbeitet:
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.
 
Zurück