# JPanel in JTable Zelle adden



## tobitobsen82 (4. Jun 2008)

Hallo Leute,

wie adde ich einer JTable Zelle/Zeile ein JPanel?

Zum Grundproblem: möchte eine Art Outlook-Kalender mit MouseListener Effekten und Daten aus einer MySQL Datenbank machen. Die Effekte und die Datenbankanbindung stellen kein Problem dar, nur habe ich mir überlegt, dass es geschickt wäre ein JPanel pro Tag zu haben, dem ich beliebige Eigenschaften (zB den Tag) und Inhalte per JLabel etc. adden kann. Komme aber wie oben schon beschrieben nicht auf die Idee, wie ich die JPanels meinen Rows adden kann.

Danke für die Hilfe!


----------



## tobitobsen82 (4. Jun 2008)

Habe es mittlerweile mal mit einem eigenen TableModel versucht, jedoch ohne Erfolg. Leider wird gar nichts angezeigt...


```
TableModel myTableModel = new DefaultTableModel() {
		    public Class getColumnClass(int columnIndex) {
		        switch (columnIndex) {
		            case 0:
		                return String.class;
		            default:
		                return JPanel.class;
		        }
		    }
		    
		    public String getColumnName(int col) {
		        return calendarTableTitle[col];
		    }
		    public int getColumnCount() { return calendarTableTitle.length; }
		};
```


----------



## Michael... (5. Jun 2008)

siehe FAQ JTable TableCellRenderer


----------



## tobitobsen82 (5. Jun 2008)

erstmal Danke. Habe mir das mal angesehen und auch noch nach anderen Quellen für Infos gesucht und welche gefunden, aber so ganz schlau werde ich daraus noch nicht.

Habe mir einen eigenen TableCellRenderer abgeleitet von JPanel geschrieben der wie folgt aussieht:


```
public class JPanelRenderer extends JPanel implements TableCellRenderer {
	private static final long serialVersionUID = 1L;

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		add((JComponent) value);
		return this;
	}
}
```

Baue ich nun meine Tabelle wie folgt auf:



```
[...]

		calendarTableModel = new DefaultTableModel(calendarTableTitle, 0);
		calendarTable = new JTable(calendarTableModel);
		calendarTable.getColumnModel().getColumn(0).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(1).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(2).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(3).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(4).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(5).setPreferredWidth(100);

		calendarTable.getTableHeader().setResizingAllowed(true);

		calendarTable.getColumnModel().getColumn(1).setCellRenderer(new JPanelRenderer()); 
		
		generateCalendarFields();

[...]
```

bekomme ich eine NullPointerException für den Parameter "value" meines Renderers. Wie genau muss ich den Renderer einsetzen, dass hier das JPanel-Objekt übergeben wird?

Besten Dank für die Unterstützung!


----------



## Michael... (5. Jun 2008)

passt soweit alles.
Die NullPointerExc kommt weil an der Stelle im TableModel wohl null drinsteht. 
Was soll denn ins Panel rein bzw. wieso wird in der Spalte ein Panel benötigt?


----------



## tobitobsen82 (5. Jun 2008)

Ich baue einen Kalender ähnlich wie Outlook für eine Groupware zur Verwaltung von Terminen. Da sollen dann mehrere Termine/Ereignisse innerhalb eines Tages angezeigt werden und per Click/Mouseover Funktionen wie "neuer Termin" etc. möglich sein.

Hatte durch die aktuelle Monatskonstellation einen null-Wert in der 1. Woche, daher kam der Fehler.

Mit



```
public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		if(value != null){
			add((JComponent) value);	
		}
		return this;
	}
```

funktionierts einwandfrei.

Nur leider werden die Zeilenhöhen nicht dem Inhalt angepasst...mal sehen, wies weitergeht...

Danke!


----------



## tobitobsen82 (6. Jun 2008)

Das mit der Höhe war weiter kein Problem: *.setRowHeight()

Allerdings habe ich weiterhin ein Problem mit den JPanels in meiner Tabellenzelle. Zwar wird eine Panel geadded, jedoch immer dieselbe, wenngleich der JPanel-Vector definitiv (siehe Konsolenausgabe) unterschiedliche JPanels (je Tag ein eigenes JPanel) beinhaltet. Woran liegts??? Evtl. an meinem Renderer?

Danke für die Hilfe!

Klasse zur Kalender-Tabellengenerierung:


```
package gui;

import java.awt.Dimension;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import events.Handling;

public class CalendarPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	public JScrollPane calendarScrollPane;
	public DefaultTableModel calendarTableModel;
	private JTable calendarTable;
	private static final String[] calendarTableTitle = new String[] { "Monday",
			"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
	private static JPanelRenderer myRenderer = new JPanelRenderer();

	public CalendarPanel(Handling eventHandling) {
		setLayout(null);

		calendarScrollPane = new JScrollPane();
		
		calendarTableModel = new DefaultTableModel(calendarTableTitle, 0);
		calendarTable = new JTable(calendarTableModel);
		calendarTable.setRowHeight(100);
		calendarTable.getColumnModel().getColumn(0).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(1).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(2).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(3).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(4).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(5).setPreferredWidth(100);
		calendarTable.getColumnModel().getColumn(6).setPreferredWidth(100);
		
		calendarTable.getTableHeader().setResizingAllowed(true);
		
		calendarTable.getColumnModel().getColumn(0).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(1).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(2).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(3).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(4).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(5).setCellRenderer(myRenderer);
		calendarTable.getColumnModel().getColumn(6).setCellRenderer(myRenderer);
		
		calendarScrollPane.setViewportView(calendarTable);
		Dimension scrollPaneSize = new Dimension(700, 400);
		calendarScrollPane.setPreferredSize(scrollPaneSize);
		add(calendarScrollPane);
		calendarScrollPane.setBounds(20, 20, 700, 400);
		
		generateCalendarFields();
	}

	public void generateCalendarFields() {
		Calendar cal = new GregorianCalendar();
		
		Vector<CalendarElement> daysOfWeek = new Vector<CalendarElement>(7);
		
		CalendarElement newElement;
		
		int run = 0;
		int j;
		int totalDays = 0;
		for (int i = 0; i <= 5; i++) {
			switch (i) {
			case 0:
				switch (cal.getActualMinimum(Calendar.DAY_OF_MONTH)) {
				case Calendar.MONDAY:
					for (j = 1 ; j <= 7 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 7;
					totalDays = totalDays + run;
					break;
				case Calendar.TUESDAY:
					for (int k = 0; k < 1; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 6 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 6;
					totalDays = totalDays + run;
					break;
				case Calendar.WEDNESDAY:
					for (int k = 0; k < 2; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 5 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 5;
					totalDays = totalDays + run;
					break;
				case Calendar.THURSDAY:
					for (int k = 0; k < 3; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 4 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 4;
					totalDays = totalDays + run;
					break;
				case Calendar.FRIDAY:
					for (int k = 0; k < 4; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 3 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 3;
					totalDays = totalDays + run;
					break;
				case Calendar.SATURDAY:
					for (int k = 0; k < 5; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 2 ; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 2;
					totalDays = totalDays + run;
					break;
				case Calendar.SUNDAY:
					for (int k = 0; k < 6; k++) {
						newElement = new CalendarElement();
						daysOfWeek.add(newElement);
					}
					for (j = 1 ; j <= 1; j++) {
						newElement = new CalendarElement(j);
						daysOfWeek.add(newElement);
					}
					run = 1;
					totalDays = totalDays + run;
					break;
				default:
					break;
				}
				break;

			default:
				daysOfWeek.removeAllElements();
				if(totalDays <= (cal.getActualMaximum(Calendar.DAY_OF_MONTH) + 7)){
					for (j = (totalDays + 1) ; j <= (totalDays + 7); j++) {
						if(j <= cal.getActualMaximum(Calendar.DAY_OF_MONTH)){
							newElement = new CalendarElement(j);
							daysOfWeek.add(newElement);	
						} else{
							newElement = new CalendarElement();
							daysOfWeek.add(newElement);
						}
					}
					totalDays = totalDays + 7;
				}
				break;
			}
			System.out.println("************* Woche: " + i);
			for(int y = 0 ; y < daysOfWeek.size() ; y++){
				System.out.println(daysOfWeek.elementAt(y).getDay());
			}
			calendarTableModel.addRow(daysOfWeek);
		}
	}
}
```

Renderer-Klasse:


```
package gui;

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class JPanelRenderer extends JPanel implements TableCellRenderer {
	private static final long serialVersionUID = 1L;

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		if(value != null){
			add((JComponent) value);	
		} else{
			//add(new JPanel());
		}
		return this;
	}
}
```

Kalender-Element JPanel Klasse:


```
package gui;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.LinkedList;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class CalendarElement extends JPanel{

	private static final long serialVersionUID = 1L;

	private int day;
	private LinkedList<String> eventList = new LinkedList<String>();
	private JLabel testLabel = new JLabel("test");
	
	public CalendarElement(int day){
		setLayout(new GridLayout(1,1));
		setMinimumSize(new Dimension(95,40));
		
		this.day = day;
		eventList.add("TestEvent am Tag: " + day);
		
		for(int i = 0 ; i < eventList.size() ; i++){
			add(new JLabel(eventList.get(i)));
		}
		
		add(testLabel);
	}
	
	public CalendarElement(){
		setLayout(new GridLayout(1,1));
		setMinimumSize(new Dimension(95,40));
	}
	
	public void setDay(int day){
		this.day = day;
	}
	
	public int getDay(){
		return day;
	}
	
	public void addEventToList(String event){
		eventList.add(event);
	}
	
	public LinkedList<String> getEventList(){
		return eventList;
	}
}
```


----------



## tobitobsen82 (6. Jun 2008)

Problem gelöst:

Zeile 62 der Table Klasse muss in die for-Schleife.

Dennoch danke.


----------

