aus einem JTable einen Wert auslesen

peshay

Mitglied
hi, also ich hab folgendes problem:
ich hab eine tabelle mit einem ListSelectionListener der mir sagen soll auf welche zeile geklickt wurde, damit ich dann aus dieser zeile eine variable auslesen kann (bzw. mit der zeilennummer aus dem ResultSet).
Nun weiss ich aber nicht, wie ich die Zeilennummer, aus dem ListSelection Listener, wieder hoch in mein hauptprogramm bekomme um denn mit dem ResultSet weiter arbeiten zu können.
Der ListSelectionListener sieht so aus:
Code:
class SharedListSelectionHandler implements ListSelectionListener 
{
	public void valueChanged(ListSelectionEvent e) 
	{ 
		ListSelectionModel lsm = (ListSelectionModel)e.getSource();

		int firstIndex = e.getFirstIndex();
		int lastIndex = e.getLastIndex();
		boolean isAdjusting = e.getValueIsAdjusting(); 

		// Find out which indexes are selected.
		int minIndex = lsm.getMinSelectionIndex();
		int maxIndex = lsm.getMaxSelectionIndex();
		for (int z = minIndex; z <= maxIndex; z++) 
		{
			System.out.println(z);
		}
	}
}
also z möchte ich gerne im Hauptprogramm weiterverwenden, halt als Zeilennummerangabe für das ResultSet.
Bisher hatte ich das Problem, wenn ich z static gemacht hab, dass ich dann oben nicht wusste wie ich das z auslese, jedesmal wenn auf eine zeile geklickt wird.
 
Original geschrieben von peshay
hi, also ich hab folgendes problem:
ich hab eine tabelle mit einem ListSelectionListener der mir sagen soll auf welche zeile geklickt wurde, damit ich dann aus dieser zeile eine variable auslesen kann (bzw. mit der zeilennummer aus dem ResultSet).
Nun weiss ich aber nicht, wie ich die Zeilennummer, aus dem ListSelection Listener, wieder hoch in mein hauptprogramm bekomme um denn mit dem ResultSet weiter arbeiten zu können.

Kannst du nicht in JTable

int getSelectedRow()
Returns the index of the first selected row, -1 if no row is selected.

oder

int[] getSelectedRows()
Returns the indices of all selected rows.

verwenden?
 
Re: Re: aus einem JTable einen Wert auslesen

Original geschrieben von Snape
Kannst du nicht in JTable

int getSelectedRow()
Returns the index of the first selected row, -1 if no row is selected.

oder

int[] getSelectedRows()
Returns the indices of all selected rows.

verwenden?

meinst du jetzt anstatt den ListSelectionListener?
hmm.. irgendwie hab ich grad n Brett vorm Kopf.. :confused:
im moment sieht das ganze so aus, das ich mein JTable auf nem frame hab, durch eine vorherige abfrage wurde es mit dem ResultSet gefüllt.
dann hab ich 2 Listener, einen ListSelection und ein ActionListener für den Button.
Wenn auf eine zeile in der Tabelle geklickt wird, springt die klasse von der ListSelection an und findet die Zeilennummer raus. Nun soll er dann, beim klick auf den Button ein bestimmtes feld aus der zeile nehmen und den Inhalt an das nächste Fenster weitergeben.

nun befindet sich das ResultSet in der Hauptklasse, wo es in die Tabelle eingelesen wird, jetzt würde ich eigentlich beim klick auf den button, versuchen den Datensatz aus dem ResultSet herrauszufinden, nur komm ich im Button nicht an das ResultSet ran, da dieses schon als Parameter an die Hauptklasse übergeben wurde.

Versteht ihr was ich meine? (ich würds nich verstehn) ^-^
naja, ihr könnts ja nachfragen..
 
Re: Re: Re: aus einem JTable einen Wert auslesen

Original geschrieben von peshay

Wenn auf eine zeile in der Tabelle geklickt wird, springt die klasse von der ListSelection an und findet die Zeilennummer raus. Nun soll er dann, beim klick auf den Button ein bestimmtes feld aus der zeile nehmen und den Inhalt an das nächste Fenster weitergeben.

nun befindet sich das ResultSet in der Hauptklasse, wo es in die Tabelle eingelesen wird, jetzt würde ich eigentlich beim klick auf den button, versuchen den Datensatz aus dem ResultSet herrauszufinden, nur komm ich im Button nicht an das ResultSet ran, da dieses schon als Parameter an die Hauptklasse übergeben wurde.

Versteht ihr was ich meine? (ich würds nich verstehn) ^-^
naja, ihr könnts ja nachfragen..

*Nachfrag* Wieso kommst Du nicht an das ResultSet ran?
Hab mit diesen ResultSet und ListSelection Klamotten noch nichts gemacht, aber letztens was von RowSets gelesen im aktuellen Javamagazin. Vielleicht hilft Dir das weiter?
Ich persönlich schwöre jedenfalls auf ein TableModel, das aus Rows besteht. Damit kann ganz einfach manuell eine Zeile gelöscht oder hinzugefügt werden usw. Und wenn man die Zeile hat, kann man genauso einfach jeden beliebigen Wert einer beliebigen Spalte auslesen.
 
ich post dir einfach mal den gesamten quelltext, vieleicht kannst du mir dann auch noch erklären wie genau man des macht mit einem TableModel das aus Rows besteht, oder wie ich am besten an mein ResultSet rankomm, oder wo überhaupt mein denkfehler bei meinem ganzen Vorhaben liegt:
Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

public class Daten_Ausgabe
{
	public Daten_Ausgabe(ResultSet rs) 
	{
		JButton JButton_Update = new JButton();
		JButton JButton_Delete;
		JButton JButton_Schliessen;
		JLabel  JLabel_Gesamtzeit;
		JLabel  JLabel_gz;
		JTextField JTextField_Gesamtzeit;
		ListSelectionModel listSelectionModel;
		
		JPanel JPanel_Optionen = new JPanel();
		JPanel_Optionen.setLayout(new FlowLayout()); 

		String[] COLHEADS = {
				"Personalnr.", 
				"Projekt",
				"Datum", 
				"Zeit",
				"Job",
				"ID"};
			
		oracle_abfrage oa = new oracle_abfrage() ;
					
		MyInternalFrame internal_frame = new MyInternalFrame("Die Ergebnisse Ihrer Suche: ");
		Container cp = internal_frame.getContentPane();
		cp.setLayout(new BorderLayout());
				
		internal_frame.setSize(718,470);
		internal_frame.setLocation(10,10);
		internal_frame.setVisible(true);
		internal_frame.setResizable(false); 
		
		float h = 0;
		float gesamtstunden = 0;
	
		JTable table = new JTable()
		{
			protected JTableHeader createDefaultTableHeader() 
			{
				return new JTableHeader(columnModel) 
				{
					public String getToolTipText(MouseEvent e) 
					{
						String[] columnToolTips = 	
						{	"Das ist die Personalnummer",
							"Der Name des Projektes",
							"Das ist das Datum der ausgeführten Tätigkeit",												
							"Arbeitszeit am Projekt ",
							"Ausgeführte Tätigkeit",
							"Job ID"	};
							
							String tip = null;
							java.awt.Point p = e.getPoint();
							int index = columnModel.getColumnIndexAtX(p.x);
							int realIndex = 
							columnModel.getColumn(index).getModelIndex();
							return columnToolTips[realIndex];
						}
					};
				}
			};	
			try
			{	
				DefaultTableModel tm = (DefaultTableModel) table.getModel();
				tm.setColumnIdentifiers(COLHEADS);	
			
				ResultSetMetaData rsmd = rs.getMetaData();
			
				JTableHeader header = table.getTableHeader();
				header.setFont(new Font("SansSerif", Font.BOLD, 14));
	
				int colNo = rsmd.getColumnCount(); 
				while(rs.next())
				{ 
					h = rs.getFloat("ZEIT");	
					gesamtstunden += h;
															
					Object[] objects = new Object[colNo]; 
							
					for(int i=0;i < colNo; i++) 
					{ 
						objects[i]=rs.getObject(i+1); 	
					} 
					tm.addRow(objects); 
				}
				
				table.setModel(tm); 
				cp.add(table);
				cp.add(JPanel_Optionen, BorderLayout.SOUTH);
				oracle_swing.desktop.add(internal_frame);
				cp.add(new JScrollPane(table), BorderLayout.CENTER);
						
			} 
			catch (Exception e){return;}
			
			JPanel_Optionen.add(JButton_Update = new JButton("Ändern"));
			JPanel_Optionen.add(JButton_Delete = new JButton("Löschen"));
			JPanel_Optionen.add(JButton_Schliessen = new JButton("Beenden"));
			JPanel_Optionen.add(JLabel_Gesamtzeit = new JLabel("Gesamtzeit:"));
			JButton_Update.addActionListener(new ButtonListen());
					
			String gs = Float.toString(gesamtstunden);
					
			JPanel_Optionen.add(JTextField_Gesamtzeit = new JTextField(gs + " h"));
			JTextField_Gesamtzeit.setEditable(false);
		try 
		{
			internal_frame.setSelected(true);
		} 
		catch (PropertyVetoException e1) 
		{
				e1.printStackTrace();
		}
		listSelectionModel = table.getSelectionModel();
		listSelectionModel.addListSelectionListener(new SharedListSelectionHandler());
		table.setSelectionModel(listSelectionModel);
		listSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	}
}

class SharedListSelectionHandler implements ListSelectionListener 
{

	static int z = 0;
	public void valueChanged(ListSelectionEvent e) 
	{ 
		ListSelectionModel lsm = (ListSelectionModel)e.getSource();
	
		int firstIndex = e.getFirstIndex();
		int lastIndex = e.getLastIndex();
		boolean isAdjusting = e.getValueIsAdjusting(); 

		// Find out which indexes are selected.
		int minIndex = lsm.getMinSelectionIndex();
		int maxIndex = lsm.getMaxSelectionIndex();
		for (z = minIndex; z <= maxIndex; z++) 
		{
		}
	}

	static int zeile()
	{
		return z-1;
	}
	
}
class ButtonListen implements ActionListener
{
	public void actionPerformed(ActionEvent arg0) 
	{
		int t = SharedListSelectionHandler.zeile();
		System.out.println(t);
	}
}

oder hab ichs vom aufbau schon falsch und sollte des alles ganz anders angehn? und wenn ja, wie? o_O
 
Zuletzt bearbeitet:
Achtung, viel Code...

Original geschrieben von peshay
ich post dir einfach mal den gesamten quelltext, vieleicht kannst du mir dann auch noch erklären wie genau man des macht mit einem TableModel das aus Rows besteht, oder wie ich am besten an mein ResultSet rankomm, oder wo überhaupt mein denkfehler bei meinem ganzen Vorhaben liegt:
oder hab ichs vom aufbau schon falsch und sollte des alles ganz anders angehn? und wenn ja, wie? o_O

OK, inKurzform, hab nen Haufen Arbeit hier liegen:
- Der Listener hat natürlich keinen Zugriff auf die Tabelle.
- Muss auf Markierung einer Zeile reagiert werden? Wenn ja, benutze einen MouseListener für die Tabelle, wenn nein, leg die Funktionalität in eine Action auf einem Button
- TableRows benutzt man in erster Linie so, dass sie als List im eigenen TableModel gehalten werden. Eine List aus TableRow Objekten, die Du Dir selbst anlegst. Z.B. so:

Code:
public class TableTestRow implements Konstanten
{
	private String m_sVorname;
	private String m_sNachname;
	private String m_sStrasse;
	private String m_sWohnort;
	private int m_iHausnummer;
	private int m_iPostleitzahl;
	
	/**
	 * Konstruktor
	 *
	 */
	TableTestRow()
	{
	}

	/**
	 * Konstruktor
	 *
	 */
	TableTestRow(	String nachname,
								String vorname,
								String strasse,
								String hausnummer,
								String plz,
								String wohnort)
	{
		this.m_sVorname = vorname;
		this.m_sNachname = nachname;
		this.m_sStrasse = strasse;
		this.m_iHausnummer = Integer.valueOf(hausnummer).intValue();
		this.m_iPostleitzahl = Integer.valueOf(plz).intValue();
		this.m_sWohnort = wohnort;
	}

	/**
	 * Konstruktor
	 *
	 */
	TableTestRow(	String nachname,
								String vorname,
								String strasse,
								int hausnummer,
								int plz,
								String wohnort)
	{
		this.m_sVorname = vorname;
		this.m_sNachname = nachname;
		this.m_sStrasse = strasse;
		this.m_iHausnummer = hausnummer;
		this.m_iPostleitzahl = plz;
		this.m_sWohnort = wohnort;
	}

	/**
	 * @return
	 */
	public int getHausnummer()
	{
		return m_iHausnummer;
	}

	/**
	 * @return
	 */
	public int getPostleitzahl()
	{
		return m_iPostleitzahl;
	}

	/**
	 * @return
	 */
	public String getNachname()
	{
		return m_sNachname;
	}

	/**
	 * @return
	 */
	public String getStrasse()
	{
		return m_sStrasse;
	}

	/**
	 * @return
	 */
	public String getVorname()
	{
		return m_sVorname;
	}

	/**
	 * @return
	 */
	public String getWohnort()
	{
		return m_sWohnort;
	}

	/**
	 * @param i
	 */
	public void setHausnummer(int i)
	{
		m_iHausnummer = i;
	}

	/**
	 * @param i
	 */
	public void setPostleitzahl(int i)
	{
		m_iPostleitzahl = i;
	}

	/**
	 * @param string
	 */
	public void setNachname(String string)
	{
		m_sNachname = string;
	}

	/**
	 * @param string
	 */
	public void setStrasse(String string)
	{
		m_sStrasse = string;
	}

	/**
	 * @param string
	 */
	public void setVorname(String string)
	{
		m_sVorname = string;
	}

	/**
	 * @param string
	 */
	public void setWohnort(String string)
	{
		m_sWohnort = string;
	}

	/**
	 * Gibt den anzuzeigenden Zelleninhalt aus
	 *
	 * @param columnIndex Die relevante Spalte
	 * @return Der anzuzeigende Zellinhalt als Object
	 */
	public Object getValueAt(int columnIndex)
	{
		switch (columnIndex)
		{
			case COL_VORNAME :
					return ( this.getVorname() );

			case COL_NACHNAME :
					return ( this.getNachname() );
					
			case COL_HAUSNUMMER :
					return (new Integer(this.getHausnummer()));

			case COL_STRASSE :
					return ( this.getStrasse() );

			case COL_POSTLEITZAHL :
				return (new Integer(this.getPostleitzahl()));
				
			case COL_WOHNORT :
					return ( this.getWohnort() );
				
			default :
					return null;
		}
	}
}

Du siehst die wichtigste Methode public Object getValueAt(int columnIndex)

Darauf greifst Du im TableModel zu:

Code:
public class TableTestTableModel extends DefaultTableModel
{
	private String[] columnNames =
	{
		"Name",
		"Vorname",
		"Straße",
		"Nr.",
		"PLZ",
		"Ort"
	};
	private Class[] classTypes =
	{ 
		String.class, // Spalte 0: Nachname
		String.class, // Spalte 1: Vorname
		String.class, // Spalte 2: Strasse		
		Integer.class, // Spalte 3: Hausnummer
		Integer.class, // Spalte 4: PLZ
		String.class, // Spalte 5: Wohnort
	};
	
	
	TableTestTableModel()
	{
		super();
	}
	
	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public int getColumnCount()
	{
			return columnNames.length;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnName(int)
	 */
	public String getColumnName(int col)
	{
		return columnNames[ col ];
	}
	
	/**
	 * Die Klassen der Spalten (für den CellEditor)
	 * @param Die zugehörige Klasse
	 */
	public Class getColumnClass(int columnIndex)
	{
		return classTypes[ columnIndex ];
	}
	

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public int getRowCount()
	{
		return getRows().size();
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	public Object getValueAt(int rowIndex, int columnIndex)
	{
		Object objRet = null;
		try
		{
			objRet =
				((TableTestRow) getRows().get(rowIndex)).getValueAt(columnIndex);
		}
		catch (Exception except)
		{
		}

		return (objRet);
	}

	/**
	 * Liefert eine Zeile zurück
	 * @param row der Index der Zeile
	 * @return die Zeile
	 */
	private TableTestRow getRow(int row)
	{
		return (TableTestRow) getRows().get(row);
	}
	
	/**
	 * Die Zeilen des Modells
	 */
	private List rows;
	/**
	 * @return
	 */
	public List getRows()
	{
		if (rows == null)
		{
			rows = new ArrayList();
		}

		return rows;
	}
	
	/**
	 * Fügt eine neue Tabellenzeile hinzu
	 * 
	 * @param newRow
	 */
	public void addRow(TableTestRow newRow)
	{
		getRows().add(newRow);
		fireTableDataChanged();	
	}
}

Und damit solte klar werden, was ich mit
"Kannst du nicht in JTable

int getSelectedRow()
Returns the index of the first selected row, -1 if no row is selected."

meine. Du bekommst damit die selektierte Zeile und holst sie im TableModel mit (TableTestRow) getRows().get(selectedIndex) und kannst jede beliebige Info aus dieser Zeile auslesen, die Du in der Row angelegt hast. Du musst lediglich aus dem eingelesenen ResultSet eine Menge an TableTestRows erzeugen und im TableTestTableModel ablegen.

(Ob diesen Beitrag jemand in die Tutorials aufnimmt? *g*)
 
Vielen Dank!
Werd mir das ganze bis spätestens morgen nochmal genau durchschauen und hoffen das es dann bei mir klappt =)
 
Hallo !
Erst mal Danke an Snape für seine Beiträge - hat mir sehr geholfen ( auch wenn ich nicht der bin, der gefragt hat : )

Ich habe mich dann auch sogleich dran gegeben und die beiden Klassen nachgebildet. Allerdings bekomme ich in der Klasse TableTestTableModel ein paar Fehler gemeldet. Und jetzt weiß ich natürlich nicht woran es liegt.

Wäre also nett, wenn mir jemand weiterhelfen könnte. Habe die Fehlermeldungen in die jeweilige Folgezeile geschrieben.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import wsd2.ConstantsAndGlobals;
import java.util.AbstractList;
import java.util.ArrayList.*;


/**
 * @author ney
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class TableTestTableModel extends DefaultTableModel {
//Klasse ist TableModel für die Tabelle der Outbox.	
	

	private String[] columnNames = 
		{"Errorcode" , "Communication ID" , "Duration [ms]" , "Time" };
	
	private Class[] classTypes =
	{ 
		Integer.class, // Spalte 0: Errorcode
		Integer.class, // Spalte 1: Communication ID
		Double.class,  // Spalte 2: Duration		
		Double.class,  // Spalte 3: Time
	};
	
	
	TableTestTableModel() {
		super();
	}
	
	
	
	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public int getColumnCount()
	{
			return columnNames.length;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnName(int)
	 */
	public String getColumnName(int col)
	{
		return columnNames[ col ];
	}
	
	/**
	 * Die Klassen der Spalten (für den CellEditor)
	 * @param Die zugehörige Klasse
	 */
	public Class getColumnClass(int columnIndex)
	{
		return classTypes[ columnIndex ];
	}
	

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public int getRowCount()
	{
		return getRows().size();
//---[Type mismatch: cannot convert from Dimension to int]
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	public Object getValueAt(int rowIndex, int columnIndex)
	{
		Object objRet = null;
		try
		{
			objRet =
				((TableTestRow) getRows().get(rowIndex)).getValueAt(columnIndex);
//---[The method get(int) is undefined for the type List]
		}
		catch (Exception except)
		{
		}

		return (objRet);
	}

	/**
	 * Liefert eine Zeile zurück
	 * @param row der Index der Zeile
	 * @return die Zeile
	 */
	private TableTestRow getRow(int row)
	{
		return (TableTestRow) getRows().get(row);
	}
	
	/**
	 * Die Zeilen des Modells
	 */
	private List rows;
	/**
	 * @return
	 */
	public List getRows()
	{
		if (rows == null)
		{
			rows = new ArrayList();
//---[ArrayList cannot be resolved or is not a type]
		}

		return rows;
	}
	

	
	/**
	 * Fügt eine neue Tabellenzeile hinzu
	 * 
	 * @param newRow
	 */
	public void addRow(TableTestRow newRow)
	{
		getRows().add(newRow);  
//---[The method add(String) in the type List is not applicable for the arguments (TableTestRow)]
		fireTableDataChanged();	
	}
}

Wahrscheinlich habe ich nur eine Kleinigkeit vergessen. Wäre Euch aber trotzdem für jede Hilfe dankbar.

Gruß Michael
 
Moin,
ich sehe zwei Möglichkeiten:
1. Du hast das hier vergessen:
Code:
/**
	 * Die Zeilen des Modells
	 */
	private List rows;

oder

2. Dein Import für die ArrayList ist falsch (wahrscheinlicher). Statt
import java.util.ArrayList.*;

muss es heissen

import java.util.ArrayList;

Dann erkennt der Compiler auch die ArrayList für die ganze row-Kiste. Evtl für List auch noch

import java.util.List;
 
Ah! Besten Dank !

Ich hatte was falsches importiert ... aber jetzt sind alle Fehler weg. Ich hatte schon angefangen die ganzen Funktionen umzuschreiben (mit mäßigem Erfolg).
 

Neue Beiträge

Zurück