# Tabelle komplett neu laden



## daily (28. Mrz 2007)

Heho,

ich habe folgendes Problem:

In einer kleinen GUI befindet sich u.A. eine Combobox und eine Tabelle. Wenn ich den Wert in der ComboBox durch Auswahl ändere soll sich der komplette Tabelleninhalt ändern. Und genau da komm ich nicht weiter. Ich hab die neuen Daten quasi schon im TableModel das von der Tabelle verwendet wird, aber ich kann der Tabelle irgendwie nicht sagen dass es die Daten aus dem Model neu laden soll.

Hier der Code der GUI:


```
package xxx;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import de.siemens.ipns.scc.stg.model.GetSet;
import de.siemens.ipns.scc.stg.model.GetSetNumbers;
import de.siemens.ipns.scc.stg.model.SqlStatement;
import de.siemens.ipns.scc.stg.model.SqlStatementWithArgs;
import de.siemens.ipns.scc.stg.model.TableSetView;

/* TODO: Action Listener schreiben
 * TODO: Spaltensortierung ermöglichen
 */

public class SetView {

	private JFrame frame_;
	private JLabel waehlen_;
	private JLabel aendern_;
	private JPanel tableViewport_;
	private JPanel setChoiceViewport_;
	private JPanel aendernViewport_;
	private JComboBox setChoice_;
	private ResultSet setsNrs_;
	private ResultSet sets_;
	private JButton aendernButton_;
	private ActionListener getSetContentListener = new getSetContentController();
	private Connection con;
	private TableSetView contentTable_;
	public SetView(Connection con) {

		// Erstellen des Frames
		this.con = con;
		frame_ = new JFrame("Set-Anzeige");
		frame_.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame_.getContentPane().setLayout(new BorderLayout());
		frame_.setResizable(false);

		setChoiceViewport_ = new JPanel();
		setChoiceViewport_.setLayout(new BorderLayout());
		setChoiceViewport_.setPreferredSize(new Dimension(600, 20));
		setChoiceViewport_.setOpaque(true);

		// Erstellen des Info-Labels zur Combobox
		waehlen_ = new JLabel("Bitte waehlen Sie das anzuzeigende Set aus:   ");
		setChoiceViewport_.add(BorderLayout.WEST, waehlen_);

		// Erstellen der Combobox mit den Setnummern
		setChoice_ = new JComboBox();
		setChoice_.setPreferredSize(new Dimension(45, 30));

		SqlStatement getSetNumbers = new GetSetNumbers();
		setsNrs_ = getSetNumbers.getResult(con);

		int i = 0;
		try {
			while (setsNrs_.next()) {
				setChoice_.insertItemAt(setsNrs_.getString(1), i);
				i++;
			}
			if (i > 0)
				setChoice_.setSelectedIndex(0);
		} catch (SQLException x) {
			x.printStackTrace();
		}

		// Combobox mit Setnummern dem Frame hinzufuegen
		setChoiceViewport_.add(BorderLayout.EAST, setChoice_);
		frame_.getContentPane().add(BorderLayout.NORTH, setChoiceViewport_);

		// Erstellen und hinzufuegen der Tabelle mit dem Inhalt des erstellen
		// Sets
		Object[][] data = {};
		contentTable_ = new TableSetView(data);
		contentTable_.setOpaque(true); // content panes must be opaque

		tableViewport_ = new JPanel();
		tableViewport_.setLayout(new BorderLayout());
		tableViewport_.setPreferredSize(new Dimension(620, 230));
		tableViewport_.setOpaque(true);
		tableViewport_.add(contentTable_);

		frame_.getContentPane().add(BorderLayout.CENTER, tableViewport_);
		
		//Hinzufuegen des Action Listeners für die ComboBoc weil nun auch die Tabelle existiert
		setChoice_.addActionListener(getSetContentListener);
		
		// Erstellen des Info-Labels zum Aendern-Button
		aendernViewport_ = new JPanel();
		aendernViewport_.setLayout(new BorderLayout());
		aendernViewport_.setPreferredSize(new Dimension(600, 50));
		aendernViewport_.setOpaque(true);

		aendern_ = new JLabel(
				"Bitte wählen Sie die zu ändernden Datensätze aus und klicken Sie anschließend auf „Ändern“");
		aendernViewport_.add(BorderLayout.NORTH, aendern_);

		// Button zum Wechesel zjm naechsten Screen zwecks Änderung von
		// Datensätzen
		aendernButton_ = new JButton("Ändern");
		aendernButton_.addActionListener(getSetContentListener);
		aendernViewport_.add(BorderLayout.SOUTH, aendernButton_);
		frame_.getContentPane().add(BorderLayout.SOUTH, aendernViewport_);
		
		// Fertigstellen des Frames
		frame_.addWindowListener(new FrameController());
		frame_.pack();
		frame_.setVisible(true);
	}

	private class getSetContentController implements ActionListener {

		public void actionPerformed(ActionEvent anActionEvent) {
			try {
				SqlStatementWithArgs getSet = new GetSet();
				String[] args = { (String) setChoice_.getSelectedItem() };
				System.out.println(args[0]);
				sets_ = getSet.getResult(con, args);
				
				int j = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						j++;
					}
				}
				
				Object[][] data = new Object[12][j];
				
				int i = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						data[i][0]= sets_.getString(1);
						data[i][1]= new Boolean(false);
						data[i][2]= sets_.getString(2);
						data[i][3]= sets_.getString(3);
						data[i][4]= sets_.getString(4);
						data[i][5]= sets_.getString(5);
						data[i][6]= sets_.getString(6);
						data[i][7]= sets_.getString(7);
						data[i][8]= sets_.getString(8);
						data[i][9]= sets_.getString(9);
						data[i][10]= sets_.getString(10);
						data[i][11]= sets_.getString(11);
				
						i++;
						}
				}
				
				frame_.setVisible(false);
				tableViewport_.remove(contentTable_);
				contentTable_= new TableSetView(data);
				tableViewport_.add(BorderLayout.CENTER, contentTable_);
				frame_.setVisible(true);
				
			} catch (IllegalArgumentException x) {
				new ExceptionView(frame_, x);
			} catch (SQLException x) {
				new ExceptionView(frame_, x);
			}
		}
	}

	private class FrameController extends WindowAdapter {
		public void windowClosing(WindowEvent aWindowEvent) {
			aWindowEvent.getWindow().dispose();
		}
	}

}
```

Und der Code des Tabellen-Modells:


```
package xxx;

import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class TableSetView extends JPanel {

	private static final long serialVersionUID = -635949636482015396L;
	private JTable table_;
	private SetViewTableModel model_ = new SetViewTableModel();
	
	//Erstellen der Tabelle
	public TableSetView(Object[][] data) {
		
		model_.setData(data);
		table_ = new JTable(model_); // neue Tabelle nach dem SetViewTableModel erstellen
		table_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // autm. Größenanpassung der Spalten ausschalten
		table_.getTableHeader().setReorderingAllowed(false);
		table_.setPreferredScrollableViewportSize(new Dimension(600, 150)); // Darstellungsgröße
		int tablesize = table_.getColumnCount(); // Tabellengröße auslesen

		// Alle Spalten auf die optimale Breite bringen
		for (int i = 0; i < tablesize; i++) { 
			packColumn(table_, i, 5);
		}

		// Die Ausrichtung aller Spalten einstellen
		table_.setDefaultRenderer(Object.class, new ColumnAlignRenderer());
		
		// Die Ausrichtung aller Header einstellen
		renderHeaders();

		// Erstellen der Scrollleisten
		JScrollPane scrollPane = new JScrollPane(table_,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

		add(scrollPane); // die Scrollleisten zur Tabelle hinzufügen

	}

	// Spalten auf die optimale Breite bringen
	public void packColumn(JTable table, int vColIndex, int margin) {
		DefaultTableColumnModel colModel = (DefaultTableColumnModel) table
				.getColumnModel();
		TableColumn col = colModel.getColumn(vColIndex);
		int width = 0;

		// Get width of column header
		TableCellRenderer renderer = col.getHeaderRenderer();
		if (renderer == null) {
			renderer = table.getTableHeader().getDefaultRenderer();
		}
		Component comp = renderer.getTableCellRendererComponent(table, col
				.getHeaderValue(), false, false, 0, 0);
		width = comp.getPreferredSize().width;

		// Get maximum width of column data
		for (int r = 0; r < table.getRowCount(); r++) {
			renderer = table.getCellRenderer(r, vColIndex);
			comp = renderer.getTableCellRendererComponent(table, table
					.getValueAt(r, vColIndex), false, false, r, vColIndex);
			width = Math.max(width, comp.getPreferredSize().width);
		}

		width += 2 * margin;
		col.setPreferredWidth(width);
	}

	// Header ausrichten
	public void renderHeaders() {
		HeaderAlignRender header = new HeaderAlignRender();

		for (int i = 0; i < 11; i++) {
			table_.getColumnModel().getColumn(i).setHeaderRenderer(header);
		}
	}
	
	public void setData(Object[][] data){
		model_.setData(data);
	}
	
	public void fireTableDataChanged(){
		model_.fireTableDataChanged();
	}
	
	
	// Das Modell für die Tabelle in SetView
	private class SetViewTableModel extends AbstractTableModel {

		private static final long serialVersionUID = -2313850031325603668L;

		private String[] columnNames = { " ConfNr", " Aendern", " im Inventar",
				" Verliehen", " PSTNr", " ErzeugnisNr", " ErzeugnisNr2",
				" Ueberschrift", " Menge", " Seriennr.", " Kommentar" };

		private Object[][] data = { { "116", new Boolean(false), "nein",
				"nein", "CUA978", "L30250F 622A978", "L30250-F622-A978",
				"Aktivierungsschlüssel für Rest of World", "1", "", "" } };

		public int getColumnCount() {
			return columnNames.length;
		}

		public int getRowCount() {
			return data.length;
		}

		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Object getValueAt(int row, int col) {
			return data[row][col];
		}

		public Class getColumnClass(int c) {
			return getValueAt(0, c).getClass();
		}

		public boolean isCellEditable(int row, int col) {
			if (col == 1) {
				return true;
			} else {
				return false;
			}
		}

		public void setValueAt(Object value, int row, int col) {
			data[row][col] = value;
			fireTableCellUpdated(row, col);
		}

		public Object[][] getData() {
			return data;
		}
		
		public void setData(Object[][] data) {
			this.data = data;
		}
	}

	// Klase zur Ausrichtung aller Spalten in der Tabelle in SetView
	private class ColumnAlignRenderer extends DefaultTableCellRenderer {

		private static final long serialVersionUID = 3769977988764788794L;

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);

			if (column == 7 || column == 10)
				setHorizontalAlignment(LEFT);
			else
				setHorizontalAlignment(CENTER);

			return this;
		}
	}

	//Klasse zur Ausrichtung aller Header der Tabelle in SetView
	private class HeaderAlignRender extends DefaultTableCellRenderer {

		private static final long serialVersionUID = -3784038794680191265L;

		public Component getTableCellRendererComponent(JTable table,
				Object arg1, boolean arg2, boolean arg3, int arg4, int column) {

			Component toReturn = table.getTableHeader().getDefaultRenderer()
					.getTableCellRendererComponent(table, arg1, arg2, arg3,
							arg4, column);

			if (column == 7 || column == 10)
				((JLabel) toReturn)
						.setHorizontalAlignment(DefaultTableCellRenderer.LEFT);
			else
				((JLabel) toReturn)
						.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
			return toReturn;
		}
	}
}
```


----------



## AlArenal (28. Mrz 2007)

Die relevante Zeile Code sollen wir uns nun selber suchen? Och nööö....

Verrrat mal warum meine Suchfunktion sagt, dass es in deinem Code kein #setModel-Aufruf gibt?


----------



## TRunKX (28. Mrz 2007)

Nimm mal folgendes Konstrukt beim erstellen mit dem DefaultTableModel


also: *räusper*

DefaultTableModel dtm = new DefaultTableModel ();
JTable jt = new JTable (dtm);

so damit sollte die Angezeigte JTable bei Änderungen im Model sofort anzeigen!


MFG


----------



## AlArenal (28. Mrz 2007)

@TRunKX:

Das bringt ihn ja auch nichtr weiter. Ist ja Irrsinn die ganze JTable neu zu erzeugen, nur weil er ein neues Model anzeigen will, welches er nach eigenen Aussagen schon fertig in der Schublade hat. Wer so vorgeht ist prädestiniert für Hackentricks á la #validate und #updateUI.

JTable#setModel heißt die Lösung, alles andere ist Pfusch am Bau 

P.S.:
Ich tausch doch auch nicht den Wagen, wenn ich tanken muss...


----------



## TRunKX (28. Mrz 2007)

....  dann habe ich das Problem wohl falsch verstanden.....


----------



## daily (28. Mrz 2007)

Hab jetz alles mal ein wenig verändert. Unter anderem meine ModelClass als extra Klasse und nicht als inner class gemacht.

Eigentlich arbeite ich nu auch mit set bzw. getModel. Aber aktualisiert wird die Tabelle trotzdem nicht. Muss ich nicht irgendwie erst nen Refresh machen oder so? Anbei nochmal der aktuelle Code. Wobei aus miener Sicht folgende Zeilen relevant sind:


```
private class getSetContentController implements ActionListener {

		public void actionPerformed(ActionEvent anActionEvent) {
			try {
				SqlStatementWithArgs getSet = new GetSet();
				String[] args = { (String) setChoice_.getSelectedItem() };
				System.out.println(args[0]);
				sets_ = getSet.getResult(con, args);
				
				Object[][] data = new Object[100][12];
				
				int i = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						data[i][0]= sets_.getString(1);
						data[i][1]= new Boolean(false);
						data[i][2]= sets_.getString(2);
						data[i][3]= sets_.getString(3);
						data[i][4]= sets_.getString(4);
						data[i][5]= sets_.getString(5);
						data[i][6]= sets_.getString(6);
						data[i][7]= sets_.getString(7);
						data[i][8]= sets_.getString(8);
						data[i][9]= sets_.getString(9);
						data[i][10]= sets_.getString(10);
						data[i][11]= sets_.getString(11);
				
						i++;
						}
				}
				
				SetViewTableModel model = (SetViewTableModel)contentTable_.getModel();
				model.setData(data);
				contentTable_.setModel(model);
				
	
			} catch (IllegalArgumentException x) {
				new ExceptionView(frame_, x);
			} catch (SQLException x) {
				new ExceptionView(frame_, x);
			}
		}
	}
```


Kompletter Code:


```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import de.siemens.ipns.scc.stg.model.GetSet;
import de.siemens.ipns.scc.stg.model.GetSetNumbers;
import de.siemens.ipns.scc.stg.model.SetViewTableModel;
import de.siemens.ipns.scc.stg.model.SqlStatement;
import de.siemens.ipns.scc.stg.model.SqlStatementWithArgs;
import de.siemens.ipns.scc.stg.model.TableSetView;

/* TODO: Action Listener schreiben
 * TODO: Spaltensortierung ermöglichen
 */

public class SetView {

	private JFrame frame_;
	private JLabel waehlen_;
	private JLabel aendern_;
	private JPanel tableViewport_;
	private JPanel setChoiceViewport_;
	private JPanel aendernViewport_;
	private JComboBox setChoice_;
	private ResultSet setsNrs_;
	private ResultSet sets_;
	private JButton aendernButton_;
	private ActionListener getSetContentListener = new getSetContentController();
	private Connection con;
	private TableSetView contentTable_;
	public SetView(Connection con) {

		// Erstellen des Frames
		this.con = con;
		frame_ = new JFrame("Set-Anzeige");
		frame_.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame_.getContentPane().setLayout(new BorderLayout());
		frame_.setResizable(false);

		setChoiceViewport_ = new JPanel();
		setChoiceViewport_.setLayout(new BorderLayout());
		setChoiceViewport_.setPreferredSize(new Dimension(600, 20));
		setChoiceViewport_.setOpaque(true);

		// Erstellen des Info-Labels zur Combobox
		waehlen_ = new JLabel("Bitte waehlen Sie das anzuzeigende Set aus:   ");
		setChoiceViewport_.add(BorderLayout.WEST, waehlen_);

		// Erstellen der Combobox mit den Setnummern
		setChoice_ = new JComboBox();
		setChoice_.setPreferredSize(new Dimension(45, 30));

		SqlStatement getSetNumbers = new GetSetNumbers();
		setsNrs_ = getSetNumbers.getResult(con);

		int i = 0;
		try {
			while (setsNrs_.next()) {
				setChoice_.insertItemAt(setsNrs_.getString(1), i);
				i++;
			}
			if (i > 0)
				setChoice_.setSelectedIndex(0);
		} catch (SQLException x) {
			x.printStackTrace();
		}

		// Combobox mit Setnummern dem Frame hinzufuegen
		setChoiceViewport_.add(BorderLayout.EAST, setChoice_);
		frame_.getContentPane().add(BorderLayout.NORTH, setChoiceViewport_);

		// Erstellen und hinzufuegen der Tabelle mit dem Inhalt des erstellen
		// Sets
		Object[][] data = {};
		contentTable_ = new TableSetView(data);
		contentTable_.setOpaque(true); // content panes must be opaque

		tableViewport_ = new JPanel();
		tableViewport_.setLayout(new BorderLayout());
		tableViewport_.setPreferredSize(new Dimension(620, 230));
		tableViewport_.setOpaque(true);
		tableViewport_.add(contentTable_);

		frame_.getContentPane().add(BorderLayout.CENTER, tableViewport_);
		
		//Hinzufuegen des Action Listeners für die ComboBoc weil nun auch die Tabelle existiert
		setChoice_.addActionListener(getSetContentListener);
		
		// Erstellen des Info-Labels zum Aendern-Button
		aendernViewport_ = new JPanel();
		aendernViewport_.setLayout(new BorderLayout());
		aendernViewport_.setPreferredSize(new Dimension(600, 50));
		aendernViewport_.setOpaque(true);

		aendern_ = new JLabel(
				"Bitte wählen Sie die zu ändernden Datensätze aus und klicken Sie anschließend auf „Ändern“");
		aendernViewport_.add(BorderLayout.NORTH, aendern_);

		// Button zum Wechesel zjm naechsten Screen zwecks Änderung von
		// Datensätzen
		aendernButton_ = new JButton("Ändern");
		aendernButton_.addActionListener(getSetContentListener);
		aendernViewport_.add(BorderLayout.SOUTH, aendernButton_);
		frame_.getContentPane().add(BorderLayout.SOUTH, aendernViewport_);
		
		// Fertigstellen des Frames
		frame_.addWindowListener(new FrameController());
		frame_.pack();
		frame_.setVisible(true);
	}

	private class getSetContentController implements ActionListener {

		public void actionPerformed(ActionEvent anActionEvent) {
			try {
				SqlStatementWithArgs getSet = new GetSet();
				String[] args = { (String) setChoice_.getSelectedItem() };
				System.out.println(args[0]);
				sets_ = getSet.getResult(con, args);
				
				Object[][] data = new Object[100][12];
				
				int i = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						data[i][0]= sets_.getString(1);
						data[i][1]= new Boolean(false);
						data[i][2]= sets_.getString(2);
						data[i][3]= sets_.getString(3);
						data[i][4]= sets_.getString(4);
						data[i][5]= sets_.getString(5);
						data[i][6]= sets_.getString(6);
						data[i][7]= sets_.getString(7);
						data[i][8]= sets_.getString(8);
						data[i][9]= sets_.getString(9);
						data[i][10]= sets_.getString(10);
						data[i][11]= sets_.getString(11);
				
						i++;
						}
				}
				
				SetViewTableModel model = (SetViewTableModel)contentTable_.getModel();
				model.setData(data);
				contentTable_.setModel(model);
				
	
			} catch (IllegalArgumentException x) {
				new ExceptionView(frame_, x);
			} catch (SQLException x) {
				new ExceptionView(frame_, x);
			}
		}
	}

	private class FrameController extends WindowAdapter {
		public void windowClosing(WindowEvent aWindowEvent) {
			aWindowEvent.getWindow().dispose();
		}
	}

}
```


```
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class TableSetView extends JPanel {

	private static final long serialVersionUID = -635949636482015396L;
	private JTable table_;
	private SetViewTableModel model_ = new SetViewTableModel();
	
	//Erstellen der Tabelle
	public TableSetView(Object[][] data) {
		
		model_.setData(data);
		table_ = new JTable(); // neue Tabelle nach dem SetViewTableModel erstellen
		setModel(model_);
		table_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // autm. Größenanpassung der Spalten ausschalten
		table_.getTableHeader().setReorderingAllowed(false);
		table_.setPreferredScrollableViewportSize(new Dimension(600, 150)); // Darstellungsgröße
		int tablesize = table_.getColumnCount(); // Tabellengröße auslesen

		// Alle Spalten auf die optimale Breite bringen
		for (int i = 0; i < tablesize; i++) { 
			packColumn(table_, i, 5);
		}

		// Die Ausrichtung aller Spalten einstellen
		table_.setDefaultRenderer(Object.class, new ColumnAlignRenderer());
		
		// Die Ausrichtung aller Header einstellen
		renderHeaders();

		// Erstellen der Scrollleisten
		JScrollPane scrollPane = new JScrollPane(table_,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

		add(scrollPane); // die Scrollleisten zur Tabelle hinzufügen

	}

	public void setModel(AbstractTableModel model){
		table_.setModel(model);
	}
	
	public AbstractTableModel getModel(){
		return (AbstractTableModel)table_.getModel();
	}
	
	// Spalten auf die optimale Breite bringen
	public void packColumn(JTable table, int vColIndex, int margin) {
		DefaultTableColumnModel colModel = (DefaultTableColumnModel) table
				.getColumnModel();
		TableColumn col = colModel.getColumn(vColIndex);
		int width = 0;

		// Get width of column header
		TableCellRenderer renderer = col.getHeaderRenderer();
		if (renderer == null) {
			renderer = table.getTableHeader().getDefaultRenderer();
		}
		Component comp = renderer.getTableCellRendererComponent(table, col
				.getHeaderValue(), false, false, 0, 0);
		width = comp.getPreferredSize().width;

		// Get maximum width of column data
		for (int r = 0; r < table.getRowCount(); r++) {
			renderer = table.getCellRenderer(r, vColIndex);
			comp = renderer.getTableCellRendererComponent(table, table
					.getValueAt(r, vColIndex), false, false, r, vColIndex);
			width = Math.max(width, comp.getPreferredSize().width);
		}

		width += 2 * margin;
		col.setPreferredWidth(width);
	}

	// Header ausrichten
	public void renderHeaders() {
		HeaderAlignRender header = new HeaderAlignRender();

		for (int i = 0; i < 11; i++) {
			table_.getColumnModel().getColumn(i).setHeaderRenderer(header);
		}
	}

	// Klase zur Ausrichtung aller Spalten in der Tabelle in SetView
	private class ColumnAlignRenderer extends DefaultTableCellRenderer {

		private static final long serialVersionUID = 3769977988764788794L;

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);

			if (column == 7 || column == 10)
				setHorizontalAlignment(LEFT);
			else
				setHorizontalAlignment(CENTER);

			return this;
		}
	}

	//Klasse zur Ausrichtung aller Header der Tabelle in SetView
	private class HeaderAlignRender extends DefaultTableCellRenderer {

		private static final long serialVersionUID = -3784038794680191265L;

		public Component getTableCellRendererComponent(JTable table,
				Object arg1, boolean arg2, boolean arg3, int arg4, int column) {

			Component toReturn = table.getTableHeader().getDefaultRenderer()
					.getTableCellRendererComponent(table, arg1, arg2, arg3,
							arg4, column);

			if (column == 7 || column == 10)
				((JLabel) toReturn)
						.setHorizontalAlignment(DefaultTableCellRenderer.LEFT);
			else
				((JLabel) toReturn)
						.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
			return toReturn;
		}
	}
}
```


```
import javax.swing.table.AbstractTableModel;

//Das Modell für die Tabelle in SetView
public class SetViewTableModel extends AbstractTableModel {

	private static final long serialVersionUID = -2313850031325603668L;

	private String[] columnNames = { " ConfNr", " Aendern", " im Inventar",
			" Verliehen", " PSTNr", " ErzeugnisNr", " ErzeugnisNr2",
			" Ueberschrift", " Menge", " Seriennr.", " Kommentar" };

	private Object[][] data = {};

	public int getColumnCount() {
		return columnNames.length;
	}

	public int getRowCount() {
		return data.length;
	}

	public String getColumnName(int col) {
		return columnNames[col];
	}

	public Object getValueAt(int row, int col) {
		return data[row][col];
	}

	public Class getColumnClass(int c) {
		return getValueAt(0, c).getClass();
	}

	public boolean isCellEditable(int row, int col) {
		if (col == 1) {
			return true;
		} else {
			return false;
		}
	}

	public void setValueAt(Object value, int row, int col) {
		data[row][col] = value;
		fireTableCellUpdated(row, col);
	}

	public Object[][] getData() {
		return data;
	}
	
	public void setData(Object[][] data) {
		this.data = data;
	}
}
```


----------



## AlArenal (28. Mrz 2007)

Viel zuviel Code.. 

Ich hatte zunächst angenommen du würdest die neuen Daten auch in eine neue Model-Instanz packen. Dann hätte das mit #setModel auch funktioniert.

Du aber schmeißt nur neue Daten in die bestehende und gesetzte Model-Instanz, da wird #setModel unwirksam. Ich gehe sogar ohne nachzuschauen jede Wette ein, dass in im Source zu JTabel#setModel die Mthode nicht durchexerziert wird, wenn du das bereits gesetzte Model nochmal setzt - wozu auch?

Wenn du aber so vorgehen willst, muss die #setData deines Models an den Listener (die JTable) einen passenden TableModelChangedEvent abfeuern, denn wie sonst soll die JTable erfahren, dass sich im Model etwas geändert hat?


----------



## TRunKX (28. Mrz 2007)

Ich sags echt nur ungern aber das DeflautTableModel hat das schon.

Zum Thema tanken von eben....

Wenn ich ins Gelände will dann nahem ich mir nen Jeep wenn ich auf die Autobahn will dann nen Sportwagen und wenn ich beides will baue ich es mir selber. so isses auch bei Java manchmal stellt man im Gebirge fest das  der Lambo zu tief liegt!


----------



## AlArenal (28. Mrz 2007)

TRunKX hat gesagt.:
			
		

> Ich sags echt nur ungern aber das DeflautTableModel hat das schon.



Ich sags auch ungern, aber er benutzt keines, sondern ein SetViewTableModel extends AbstractTableModel und da gibts ein #fireTableDataChanged.

Damit ist er nur noch halb so feißig wie ich, der sich seine Models immer selbst schnitzt aber noch nicht so faul wie du - und das vielleicht mit voller Absicht?


----------



## daily (28. Mrz 2007)

Hab nu wieder mal was geändert und bin nu auch nen Schritt weiter:


```
private class getSetContentController implements ActionListener {

		public void actionPerformed(ActionEvent anActionEvent) {
			try {
				SqlStatementWithArgs getSet = new GetSet();
				String[] args = { (String) setChoice_.getSelectedItem() };
				System.out.println(args[0]);
				sets_ = getSet.getResult(con, args);
				
				Object[][] data = new Object[100][11];
				
				int i = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						data[i][0]= sets_.getString(1);
						data[i][1]= new Boolean(false);
						data[i][2]= sets_.getString(2);
						data[i][3]= sets_.getString(3);
						data[i][4]= sets_.getString(4);
						data[i][5]= sets_.getString(5);
						data[i][6]= sets_.getString(6);
						data[i][7]= sets_.getString(7);
						data[i][8]= sets_.getString(8);
						data[i][9]= sets_.getString(9);
						data[i][10]= sets_.getString(10);
						i++;
						}
				}
				
				SetViewTableModel model = (SetViewTableModel)contentTable_.getModel();
				model.setData(data);
				contentTable_.setModel(model);
				contentTable_.getModel().fireTableDataChanged();
		
	
			} catch (IllegalArgumentException x) {
				new ExceptionView(frame_, x);
			} catch (SQLException x) {
				new ExceptionView(frame_, x);
			}
		catch (NullPointerException x) {
			new ExceptionView(frame_, x);
		}
		}
	}
```

Neu hinzugekommen ist u.A. contentTable_.getModel().fireTableDataChanged();
Aber nu is alles recht seltsam. Zwar wird mir in der Tabelle in 2 von 10 fällen was angezeigt, aber:
- Wenn ich nach rechts scrolle stimmen nach kurzer Zeit die Spalten nicht mehr mit den Header überein. Um genau zu sein ist ein Header (kommentar) verschwunden.
-Sobald das passiert hagelt es NullPointerExceptions die sich aber ulkigerweise nicht catchen lassen
- Wenn man nach unten scrolled hagelt es auch an nem gewissen Punkt NullPointerExceptions
- Bei der erwähnten Sache mit den nicht mehr übereinstimmenden Header und Spalten verschwinden sobald diese nicht mehr übereinstimmung anfängt etliche Zeilen.
- Durch markieren von Spalten wird diese Übereinstimmung wieder kurz hergestellt und die Zeilen werden wieder sichtbar.
-Alles in allem hagelt es aber pausenlos genannte Exceptions


----------



## AlArenal (28. Mrz 2007)

Schön, dass du keine einzige Exception gepostet hast...

Sind die "neuen" Daten auch anders aufgebaut? Nimm mal statt #fireTableDataChanged #fireTableStructureChanged oder erzeug ein neues Model.


----------



## daily (28. Mrz 2007)

Sowohl fireTableStructureChange als auch das Erstellen eines neuen Modells haben nichts gebracht. Die korrekte Spaltenanzahl und die orrekten Bezeichnungen hat er, das habe ich per sysout überprüft.

Hier eine Exception.

```
java.lang.NullPointerException
	at xxx.model.SetViewTableModel.getColumnClass(SetViewTableModel.java:33)
	at javax.swing.JTable.getColumnClass(Unknown Source)
	at javax.swing.JTable.getCellRenderer(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
	at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
	at javax.swing.plaf.ComponentUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JViewport.blitDoubleBuffered(Unknown Source)
	at javax.swing.JViewport.windowBlitPaint(Unknown Source)
	at javax.swing.JViewport.setViewPosition(Unknown Source)
	at javax.swing.plaf.basic.BasicScrollPaneUI$HSBChangeListener.stateChanged(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.fireStateChanged(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.setRangeProperties(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.setValue(Unknown Source)
	at javax.swing.JScrollBar.setValue(Unknown Source)
	at javax.swing.plaf.basic.BasicScrollBarUI.scrollByUnits(Unknown Source)
	at javax.swing.plaf.basic.BasicScrollBarUI.scrollByUnit(Unknown Source)
	at javax.swing.plaf.basic.BasicScrollBarUI$ArrowButtonListener.mousePressed(Unknown Source)
	at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


EDIT:

Es muss irgendwas mit der Art und Weise sein wie ich die Daten zusammenbaue. Wenn ich selbiges wie unten stehend manuell mache funtkzionierts.


```
Object[][] data = {{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"},
						{"Bla", new Boolean(false), "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla", "Bla"}
				};
```


----------



## AlArenal (28. Mrz 2007)

Dann sind deine Daten pisse. Denn wenn es hier ne NPE gibt ".getColumnClass(SetViewTableModel.java:33) ", dann ja wohl weil #getValueAt null liefert und weil auf einem null schlecht #getClass aufgerufen werden kann.


----------



## daily (28. Mrz 2007)

Es funktioniert!

Hab das Problem gefunden. Die Daten kommen ja aus einer Acces-Datenbank. Bei der Abfrage die ich erstelle entstehen beim Kommentar bzw. der Seriennummer teilweise Leerfelder. Diese Leerfelder werden beim einlesen aus dem ResultSet in das Object-Array als Null interpretiert und wandern genau so in die Tabelle. Hab nu nen kleinen Workarround geschrieben der aus Null einfach ein Leerzeichen macht. Und nun funktionierts 

Vielleicht hilft das ja in Zukunft mal jemandem. Ich häng den Workarounf noch unten an. Wenn ich nu noch rausfinde wie ich die Größe eines Resultsets rausfinde ohne es zu durchlaufen bin ich dann mit de Teil auch fertig 


Workaround

```
private class getSetContentController implements ActionListener {

		public void actionPerformed(ActionEvent anActionEvent) {
			try {
				SqlStatementWithArgs getSet = new GetSet();
				String[] args = { (String) setChoice_.getSelectedItem() };
				sets_ = getSet.getResult(con, args);

				Object[][] data = new Object[100][11];
				String[] tempArray = new String[11]; 
				
				int i = 0;
				if (sets_ != null) {
					while (sets_.next()) {
						for (int j=1; j<11;j++){
							tempArray[j]= sets_.getString(j);
						}
						
						for (int l = 0;l<11;l++){
							if (l==0) if (tempArray[l+1]==null) data[i][l] = " "; else data[i][l] = tempArray[l+1];
							else if(l==1) data[i][l] = new Boolean(false);
							else  if (tempArray[l-1]==null) data[i][l] = " "; else data[i][l] = tempArray[l-1];
							
						}
						i++;
					}
				}

				SetViewTableModel model = new SetViewTableModel();
				model.setData(data);
				contentTable_.setModel(model);
				contentTable_.getModel().fireTableStructureChanged();

			} catch (IllegalArgumentException x) {
				new ExceptionView(frame_, x);
			} catch (SQLException x) {
				new ExceptionView(frame_, x);
			} catch (NullPointerException x) {
				new ExceptionView(frame_, x);
			}
		}
	}
```


----------



## AlArenal (28. Mrz 2007)

Alternativ hättest du auch auf null Werte im Model prüfen können - das ist die sichere Variante.


----------

