# JTable - eine fixe Spalte, der Rest scrollbar



## Student (24. Nov 2004)

Also.
Folgendes Problem.

Ich möchte mittels einer JTable folgendes erreichen.

Die 'Table' soll links eine fixe Spalte haben. Die weiteren Spalten - beliebig viele - sollen dann scrollbar sein.
Heißt also, dass nur zwei oder drei Spalten sichtbar sind, wobei die linke immer zu sehen ist und die rechten scrollbar sind.

Ich habe einfach überhaupt keine Ahnung von 'JTable', so dass ich nicht weiß, wie ich da rangehen soll.

Eine kleine Einleitung und ein Denkansatz für die Lösung meines Problems wäre klasse.


Grüße Ben ;-)


----------



## dotlens (24. Nov 2004)

ich denke da wäre es am sinnvolsten, 2 jtables zu machen, eine fix und eine uaf nem scrollpane. sonst dürfte das ziemlich kompliziert sein. jtable ist in den FAQ gut beschrieben...


----------



## Student (24. Nov 2004)

hm. das habe ich mir auch schon überlegt, hatte aber gehofft, dass man es anders realisieren könnte.

gut. gehen wir mal in diese richtung.

wie schaffe ich es denn jetzt, dass die beiden tabellen so aneinanderschließen, dass es so aussieht, als wäre es eine?

es geht da ja z.b. auch um das vertikale scrollen.

das stelle ich mir jetzt 'nicht einfach' vor, das zu synchronisieren ... bzw. 'unmöglich'?

also in der API steht ja ein beispiel:

```
TableModel dataModel = new AbstractTableModel() {
          public int getColumnCount() { return 10; }
          public int getRowCount() { return 10;}
          public Object getValueAt(int row, int col) { return new Integer(row*col); }
      };
      JTable table = new JTable(dataModel);
      JScrollPane scrollpane = new JScrollPane(table);
```

das ist ja schön und gut ... aber das bringt mich in meiner morgentlichen ( mit t oder mit d? ) lethargie irgendwie nicht weiter ^^

ähem .. in der FAQ?
du meinst hier das linkverzecihnis?

ich muss noch schlafen ... ich finde das nichts (irgendwie unübersichtlich das ding 8) )


----------



## dotlens (24. Nov 2004)

hmmm, dann müsstest du immer wenn eine aktion ausgeführt wird auch die gleiche bei der andern table ausführen. das ist aber ziemlich umständlich. vieleicht hat jemand anders eine bessere idee...

FAQ: http://www.java-forum.org/de/viewforum.php?f=32
steht jede menge über JTable


----------



## Student (24. Nov 2004)

dotlens hat gesagt.:
			
		

> hmmm, dann müsstest du immer wenn eine aktion ausgeführt wird auch die gleiche bei der andern table ausführen. *das ist aber ziemlich umständlich*.


eben. denke ich auch ;-)



			
				dotlens hat gesagt.:
			
		

> vieleicht hat jemand anders eine bessere idee...


ich hoffe es. ich habe mich jetzt zwei tage durcj newsgroups etc. gewühlt .. aber irgendwie nicht das gefunden, was ich suche .. :roll:



			
				dotlens hat gesagt.:
			
		

> FAQ: http://www.java-forum.org/de/viewforum.php?f=32
> steht jede menge über JTable


ach. tzz .. blind. danke :toll: 


über weitere hilfen etc. würde ich mich freuen.


----------



## Student (24. Nov 2004)

ich bin ja auch so blind:
:arrow: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

tzzz ..

okay.
allerdings stoße ich jetzt auf das oben angesprochene problem.
also das scrollverhalten der tabellen zu synchronisieren.

das ist irgendwie viel zu aufwendig. :?

wenn übrigens jemand der google-preis für die meisten suchanfragen innerhalb der letzten 48std. gewinnen sollte .. dann bin ich der heißteste kandidat ^^

hilfe ... :shock:


----------



## abollm (24. Nov 2004)

Hi,

ich hab' hier so ein Beispiel, bei dem sind links zwei Spalten fix und die rechts daneben befindlichen sieben Spalten sind (horizontal) scrollbar. Hab' ich 'mal irgendwo ausgegraben, weiß aber nicht mehr genau wo.

Ist ein Beispiel für eien Stundenplan. Interessiert dich das?

Wenn ja, dann poste ich den Code.


----------



## Student (24. Nov 2004)

abollm hat gesagt.:
			
		

> Wenn ja, dann poste ich den Code.


du kannst mir das auch per PM schicken, wenn das zu viel ist.


ich nehme das gerne.

danke.  :toll:


----------



## dotlens (24. Nov 2004)

poste ihn bitte hier, würde mich auch interessieren


----------



## Student (24. Nov 2004)

dotlens hat gesagt.:
			
		

> poste ihn bitte hier, würde mich auch interessieren


ich hätte ihn ja dann auch hier gepostet ... eventuell etwas gekürzt. wer weiß wie viel 'tausend' zeilen code da sind  8)


----------



## abollm (24. Nov 2004)

So, nachdem der Server irgendwie in den letzten Minuten relativ langsam war, hoffe ich, dass das jetzt auch ankommt:

Code für Stundenplan:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class JTableFixedColumnExample 
extends JFrame {
	Object[][] data;

	Object[] column;

	JTable fixedTable, table;

	public JTableFixedColumnExample() {
		super("Beispiel fixierter Spalten");
		setSize(500, 340);

		data = new Object[][] { { "Fax", "Lupo", "Fix: 9:00", "", "", "", "", "","" },
				{ "Lupo", "Donald", "", "Foxi: 9:00", "", "", "Fix: 8:00", "","" },
				{ "---", "Eusebia", "", "", "Foxi: 10:00", "", "", "","" },
				{ "Erni", "Fax", "", "", "", "", "", "","" },
				{ "Bert", "---", "", "", "", "", "Fix: 12:00", "","" },
				{ "Eusebia", "Erni", "", "", "", "", "Fix: 09:00 / Foxi: 12:00", "","" },
				{ "---", "Knox", "", "", "", "", "", "Foxi: 08:00","" } };
		
		
		column = new Object[] { "Fix", "Foxi", "Mo", "Di", "Mi", "Do", "Fr",
				"So", "So" };
		
		final int rows = data.length;
		final int cols = column.length;
		TableModel fixedModel = new DefaultTableModel() {
			// Zwei Spalten werden aus der Datentabelle werdenfixiert
			public int getColumnCount() {
				return 2;
			}

			public int getRowCount() {
				return rows;
			}

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

			// As only the first two columns are reported this can stay
			// the same
			public Object getValueAt(int row, int col) {
				return data[row][col];
			}
		};
		TableModel model = new DefaultTableModel() {
			// This model has two less columns in the data as two are
			// fixed
			public int getColumnCount() {
				return cols - 2;
			}

			public int getRowCount() {
				System.out.println("Rows: "+rows);
				return rows;
			}

			public int	setHeaderValue(int col) {
				System.out.println("Col-Länge: "+column[col].toString());
				return column[col].toString().length();
			}

			public String getColumnName(int col) {
				// The columns start 2 on in the data
				return (String) column[col + 2];
			}

			public Object getValueAt(int row, int col) {
				// The first two column are for the fixed table so return
				// data after by adding 2
				return data[row][col + 2];
			}

			public void setValueAt(Object obj, int row, int col) { // As above
				data[row][col + 2] = obj;
			}

			public boolean isCellEditable(int row, int col) {
				return true;
			}
		};
	    for (int i = 0; i < column.length; ++i) {
	        TableColumn col = new TableColumn(i, i == 1 ? 150 : 60);
	        col.setHeaderValue(column[i]);
	        //model.addColumn(col);
	      }

		fixedTable = new JTable(fixedModel);
		ListSelectionModel lsm = fixedTable.getSelectionModel();
		fixedTable.getTableHeader().setResizingAllowed(false);
		lsm.addListSelectionListener(new SelectionListener(true));
		table = new JTable(model);
		lsm = table.getSelectionModel();
		lsm.addListSelectionListener(new SelectionListener(false));
		fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		JScrollPane scroll = new JScrollPane(table);
		JViewport viewport = new JViewport();
		viewport.setView(fixedTable);
		viewport.setPreferredSize(fixedTable.getPreferredSize());
		scroll.setRowHeaderView(viewport);
		scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
				.getTableHeader());
		getContentPane().add(scroll, BorderLayout.CENTER);

        getContentPane().add(new JLabel("Fix & Foxi - Besuche bei Verwandten und Freunden"), BorderLayout.NORTH);
	}

	class SelectionListener implements ListSelectionListener {
		boolean isFixedTable = true;

		public SelectionListener(boolean isFixedTable) {
			this.isFixedTable = isFixedTable;
		}

		public void valueChanged(ListSelectionEvent e) {
			if (isFixedTable) {
				int fixedSelectedIndex = fixedTable.getSelectedRow();
				table.setRowSelectionInterval(fixedSelectedIndex,
						fixedSelectedIndex);
			} else {
				int selectedIndex = table.getSelectedRow();
				fixedTable
						.setRowSelectionInterval(selectedIndex, selectedIndex);
			}
		}
	}

	public static void main(String[] args) {
		JTableFixedColumnExample frame = new JTableFixedColumnExample();
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setVisible(true);
		frame.setSize(500,340);
		frame.setLocation(100,100);
	}
}
```


----------



## Student (24. Nov 2004)

danke. erst mal reinarbeiten ... nach der mittagspause ;-)


----------



## dotlens (24. Nov 2004)

ist auch mit 2 JTable gelöst  :bae:


----------



## Student (24. Nov 2004)

dotlens hat gesagt.:
			
		

> ist auch mit 2 JTable gelöst  :bae:


ich habe gerade auch noch eine weitere anforderung erhalten.

es ist so, dass ich: wenn ich in der fixen spalte eine zeile markiere, diese zeile auch in den scrollbaren spalten markiert sein soll  ???:L 

junge junge. ich bin praktikant. ich glaube die haben sie nicht mehr alle  :shock:  :lol: 
hehe. nunja.

also, wie gesagt erst mal danke. 
beim überfliegen habe ich das jetzt nicht entdeckt - muss mich auch erst mal mit den klassen befassen - ... wird da denn die fixe spalte vertikal mitgescrollt?

grüße ben.


----------



## abollm (24. Nov 2004)

Student hat gesagt.:
			
		

> dotlens hat gesagt.:
> 
> 
> 
> ...


----------



## Student (24. Nov 2004)

abollm hat gesagt.:
			
		

> Ja, die wird mitbewegt. *Du musst nur das Fenster verkleinern*.


nicht möglich, da ich das konstrukt in ein internalframe einbetten muss.

also ich schreibe eine klasse, die ein panel, ein frame oder irgendwas anderes zurückgibt. das wird dann in ein frame eingehängt ( oder so .. bin da nicht so ganz firm mit der vorgehensweise hier. müsste ich nochmal nachhaken ).
jedenfalls ist die größe fix.

warum muss ich das fenster denn in der größe verändern? wegen der aktualisierung?


----------



## abollm (24. Nov 2004)

Student hat gesagt.:
			
		

> ...
> 
> warum muss ich das fenster denn in der größe verändern? wegen der aktualisierung?



Nein, da bei der initialisierten Größe die Anzahl der Zeilen nicht ausreicht. Wenn du die vertikale Größe entsprechend in deinem Frame so verkleinerst, dass immer mehr Zeilen vorhanden sind als im Frame angezeigt werden können, dann sollte das funktionieren.


----------



## Student (24. Nov 2004)

hm.
das habe ich nicht ganz verstanden.

was passiert denn, wenn ich 4 zeilen habe und es könnten theoretisch 10 angezeigt werden?

sorry, aber ich muss dich gerade mal ausquetschen 8)


----------



## Student (24. Nov 2004)

okay.
stop.

änderung der problemstellung.
vielleicht auch mal hier reinschauen:
:arrow:  http://www.java-forum.org/de/viewtopic.php?p=57496

:arrow: ;-)


----------

