[JAVA] Wybor w JTable

0

Witam
Stworzyłam JTable, w niej umieszczam dane z tabeli oraclowej. Nastepnie chce wybrać wiersz z tabeli i wyświetlić w JTextArea na tej samej formatce. Czytam tutoriale i almanachy ale jakoś nie moge zrozumieć jak :-( Ustawiam setRowSelectionAllowed(true), setSelectionMode(ListSelectionModel.Single_selection) i.... czy mam do tego wykorzystać Anchor Cell ? mozecie mi jakoś podpowiedziec co robić w jakiej kolejności zeby : a) wybrac wiersz b) zapisac go po kliknieciu myszka do pola textowego. Ponizej moje próby :-)Dzieki z gory za jakies podpowiedzi.
Pozdrawiam

public class dialog extends JFrame {

	private JTextField P1;
	private JTable table;
	private DefaultTableModel model;
	public static void main(String args[]) {
		try {
			dialog frame = new dialog();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public dialog() {
		super();
		setBounds(100, 100, 529, 445);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);
		setTitle("Tabela");

		final JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(20, 20, 460, 230);
		getContentPane().add(scrollPane);
		
		
		final JTable table = new JTable(50,2);
		
		table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(true);
		model= new DefaultTableModel(50,2);
		int vColIndex=0;
		int vColIndex2=1;
		table.getColumnModel().getColumn(vColIndex).setHeaderValue("Grupa");
		table.getColumnModel().getColumn(vColIndex2).setHeaderValue("Numer inwent.");
		table.getTableHeader().resizeAndRepaint();
		table.setShowVerticalLines(true);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		scrollPane.setViewportView(table);
		
		
		

		final JButton B2 = new JButton();
		B2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});
		B2.setText("Anuluj");
		B2.setBounds(254, 347, 95, 33);
		getContentPane().add(B2);

		P1 = new JTextField();
		P1.setBounds(176, 267, 175, 25);
		getContentPane().add(P1);

		final JLabel L = new JLabel();
		L.setText("Wybrany wiersz:");
		L.setBounds(55, 270, 101, 20);
		getContentPane().add(L);
	
	
    String driver="jdbc:oracle:thin:";
	String host=*******;
	String port="1521";
	String SERVICE_NAME="ZEUS";
	String user=********;
	String password=****;
	String sql= "SELECT GRUPA,NR_INW FROM BADANIE";
	Connection conn;
	Statement stmt;
	ResultSet rset;
	String connString=driver+"@"+host+":"+port+":"+SERVICE_NAME;
	
	try
	{		
		int i=0;
		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
		conn=DriverManager.getConnection(connString,user,password);
		stmt=conn.createStatement();
		rset=stmt.executeQuery(sql);
		
		while (rset.next())
		{
			table.setValueAt(rset.getString(1), i, 0);
			table.setValueAt(rset.getString(2), i, 1);
			i++;
			if (i >= 50)
				break;

		}
		rset.close();
		stmt.close();
		conn.close();
	}
	catch (SQLException e)
	{
		System.out.println(e.getMessage()+ "--> problem z polaczeniem");
		}

		final JButton B1 = new JButton();
		B1.setText("Ok");
		B1.setBounds(140, 346, 95, 33);
		getContentPane().add(B1);

	}
}
0

Witam
Najlepiej stworzyć własny model tabeli.

class myTableModel extends AbstractTableModel {
 private ArrayList list; //lista do przechowywania danych z bazy
 public Object getValueAt(int row, int col) // najważnijesza metoda dla ciebie
 public Object getObject(int index) // ta metodę wywołujesz przy kliknięciu  na określony wiersz w tabeli
 {
    return (Object) list.get(index); 
 }
}

Metoda wywołania zwrotnego zwraca wartość określonej komorki

public Object getValueAt(int row, int col)
{
   Object o = list.get(row);
   switch(col) {
   case 0:
           return  o.get....();
   case 1: 
           return o.get....();
   case  x:  //  case tyle ile masz kolumn w tabeli. 
}
Oczywiście zamiast Object używasz własnego typu w którym chcesz przechowywać dane z bazy i operować  na nich
Tak to miejwięcej sie ma nie wiem czy w miarę to wyjaśniłem, ale może to Cię bardziej naprowadzi.
}
0

Dzieki za odpowiedz . Masz racje z tym modelem, jakis podobny sobie stworzylam ale chodzi mi o to jak pozniej z tych metod zwrocic dane do np pola tekstowego. Niby proste ale metoda getObject zwraca wartosc typu Object a tego nie "wkleje" do pola. Mozna zrobic cos takiego jak getString. Całe moje zmartwienie to schemat typu: klikam myszka na wiersz i co sie wtedy dzieje :-( do czego "pakowany" jest ten wiersz, jaki to jest typ danych i jak to przekazac do JTextFieldArea :-( moze powinnam przeniesc ten temat do Newbie :>
Pozdrawiam

0

Np. myTableModel mtable = new myTableModel() teraz dla tabeli ustawiasz model myTable.setModel(mtable);
Jak klikasz myszką w wiersz to wywołujesz metodę mtable.getObject() wtedy automatycznie wywolana zosteje metoda getValueAt(int row, int col). Powinieneś mieć własną klasę do przechowywania tych danych. Zauważ że dane wczytywane z bazy danych znajdują sie na list i z niej pobierasz obiekt tobie potrzebny a poźniej jego pola prywatne.
Ok założmy ze masz klase osoba składająca sie z pol imie, nazwisko. W bazie zapisujesz do tabeli osoba. Przy pobieraniu danych z tabeli osoba tworzysz sobie obiekt osoba i jego pola wypełniasz danymi z bazy. Obiekt ląduje na liscie i tak 100 osób, później tą liste ustawiasz jako liste w swoim modelu. I jak klikasz myszką na wiersz to wlasnie jest wywolane metoda mtable.getOsoba() ktora zwaraca obiekt osoba z tymi wlaściwościami z kolumn tabeli, a to wszystko dzięki metodzie Osoba getValueAt(int row, int col).
Powiedzmy że to tak mniejwiecej wyglada. Rozdziel sobie kod do class modelTable, class polaczenieZbaza i class programGUI i bedziesz wtedy wszystko lepiej widzial.

0

Ok poradziłam sobie z modelem tabeli, korzystam z metod getString zeby wyciagnac Strina z tabeli, ale dane ktore przekazuje do pola tekstowego sa przypadkowe.
Nie potafie wykombinowac jak zrobic zeby po kliknieciu myszka wiersz w ktory kliknelam pokazal mi sie w wybranym polu [glowa]

0

Juz mam :-) zeby znalez wybrana komorke z tabeli posluzylam sie Point. Zrobilam tak:

table.addMouseListener(new MouseAdapter() {
	public void mouseClicked(MouseEvent e) {
		if (e.getClickCount() == 1) {
		Point p = e.getPoint();
		int row = table.rowAtPoint(p);
		int col = table.columnAtPoint(p);
		final String text = (String) table.getValueAt(row,col);
		T1.setText(text);
						}
					}
				});

teraz jeszcze mysle jak wybrac nie tylko komorke ale caly wiersz. Wiem ze to moze sztubacki sposób ale "debiutuje" w temacie ;-)

0

Kombinujesz, do pobrania nr wiersz używasz int row = jTable1.getSelectedRow();
nastepnie Object o = myTable.getObject(row);
Nie korzystasz bezpośrednio z getValueAt(row,col), tylko z getObject() która zwraca wlasnie twoj obiekt wypełniony danymi z wlasnie tego wiersza , wykorzystujac przy tym getValueAt(row,col), ty z tej metody bezpośrednio nie korzystasz.
Nie wiem juz jak lepiej to wyjaśnić.

public Object getObject(int index){
return (Object)list.get(index);
}
public Object getValueAt(int row, int col)
{
   Object o = list.get(row);
   switch(col) {
   case 0:
           return  o.get....();
   case 1: 
           return o.get....();
   case  x:  //  case tyle ile masz kolumn w tabeli. 
}

i teraz w zdarzeniu kliknięcia

int row = jTable1.getSelectedRow();
Object o = mtable.getObject(row); 

i dostajesz obiekt z danymi z bazy danych, które umieściłes w list, która wypełnia Tabele i dalej bawisz sie na tym obiekcie bierzesz z niego co chesz.

0

Ok masz racje kombinuje. Tylko mam taki problem. Stworzylam sobie model tabeli z wszystkimi wymaganymi metodami. Wyglada tak:

package new1;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

	private static final String[] COLUMN_NAMES = { "Numer",
			"Grupa inwentarzowa" };

	private ArrayList lista = new ArrayList();

	public MyTableModel(ArrayList list) {
		super();
		this.lista = list;
	}

	public int getColumnCount() {
		return MyTableModel.COLUMN_NAMES.length;
	}

	public int getRowCount() {
		return this.lista.size();
	}

	public String getValueAt(int rowIndex, int columnIndex) {
		Osoba o = (Osoba) this.lista.get(rowIndex);

		switch (columnIndex) {
		case 0:
			return o.getImie();
		case 1:
			return o.getNazwisko();

		}
		return null;
	}

	public Object getObject(int index) {
		return (Object) lista.get(index);
	}

	public String getColumnName(int column) {

		return MyTableModel.COLUMN_NAMES[column];
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {

		return true;
	}

	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		Osoba o = (Osoba) this.lista.get(rowIndex);
		switch (columnIndex) {
		case 0:
			o.setImie((String) aValue);
		case 1:
			o.setNazwisko((String) aValue);

		}
	}
}

Jest tam metoda getObject i przy kompilacji tej klasy Eclipse nie wyrzuca zadnego bledu. Jednak....jesli chce zastosowac ta metode w moim programie w nastepujacy sposob:

table.setModel(new MyTableModel(l));
				table.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent e) {
						if (e.getClickCount() == 1) {
							
							int row = table.getSelectedRow();
							int col = table.getSelectedColumn();
							final Object o =table.getObject(row);

l w MyTableModel to lista ktora przechowuje moje dane wyciagniete z bazy

w ostatniej lini getObject jest podkreslone na czerwono czyli nie zna tej metody pomimo ze jest w klasie modelu tabeli ( pozostale metody z tej klasy rozpoznaje). Eclipse sugeruje rowniez zmiane tej metody na readObject :-(
Moze to cos banalnego ale ja jeszcze tego nie widze :-(

0

Chym dziwne ja robie tak w NetBeans i jest wszystko dobrze na pewno jest gdzieś błąd może spróbuj tak:

public String getValueAt(int rowIndex, int columnIndex) {
                Osoba o = (Osoba) this.lista.get(rowIndex);

                switch (columnIndex) {
                case 0:
                        return o.getImie();
                case 1:
                        return o.getNazwisko();
                 default:
                    break;

                }
}

Jeżeli działasz na obiekcie osoba powyżej to

public Osoba getOsoba(int index) {
                return (Osoba) lista.get(index);
}

I może jeszcze zamiast liste inicjowac w konstruktorze to :

public void setOsobaList(ArrayList list){
this.lista = list;
fireTableDataChanged();
}
model = new MyTableModel();
model.setOsobaList(list);
jTabel1.setModel(model);
int row = table.getSelectedRow();
final Osoba o = model.getOsoba(row);

Jezeli tak bedziesz robile to powinno być dobrze ;-)

0

No niestety nie dziala tak jak piszesz. Zrobilam tak jak sugerowales ale nadal nie widzi metody getObject :-( Nie mam zielonego pojecia dlaczego ta metoda nie dziala a pozostale z tej samej klasy dzialaja bez probelmu.

0

Na pewno wywołujesz getObject() ( getOsoba() ) na modelu tabeli. Podaj jeszcze raz cały kod.

0

Wklejam kod modelu tabeli:


package new1;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import java.lang.*;

public class MyTableModel extends AbstractTableModel {

	private static final String[] COLUMN_NAMES = { "Numer",
			"Grupa inwentarzowa" };

	private ArrayList lista = new ArrayList();

	public MyTableModel(ArrayList list) {
		super();
		this.lista = list;
		fireTableDataChanged();
	}

	public int getColumnCount() {
		return MyTableModel.COLUMN_NAMES.length;
	}

	public int getRowCount() {
		return this.lista.size();
	}

	public String getValueAt(int rowIndex, int columnIndex) {
		Osoba o = (Osoba) this.lista.get(rowIndex);

		switch (columnIndex) {
		case 0:
			return o.getImie();
		case 1:
			return o.getNazwisko();
			default: 
				break;

		}
		return null;
	}

	public Osoba getOsoba(int row) {
		return (Osoba)this.lista.get(row);
	}

	public String getColumnName(int column) {

		return MyTableModel.COLUMN_NAMES[column];
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {

		return true;
	}

	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		Osoba o = (Osoba) this.lista.get(rowIndex);
		switch (columnIndex) {
		case 0:
			o.setImie((String) aValue);
		case 1:
			o.setNazwisko((String) aValue);

		}
	}
	
	
}

i pozniej uzywam metody getOsoba w klasie i niestety jej nie uznaje.

0

Znowu poradziłam sobie metoda "kombinowaną" ;-)
Zeby wybierac interesujace mnie wiersze z tabeli zastosowałam taki kod ( nieprofesjonalny jak widać :/ ,ale dziala jak nalezy :-))

table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1) {
	String text;
	String text3;
             String text4;
	String pierwszy;
							
	int col=table.getSelectedColumn();
	int row = table.getSelectedRow();
							
	switch(col){
		case 0:{
	            text3=(String) table.getValueAt(row,col);
	            T1.setText(text3);
	            text4= (String) table.getValueAt(row,col+1);
	            T2.setText(text4);
						        	
			}
		case 1:{
		pierwszy=(String) table.getValueAt(row,0);
		T1.setText(pierwszy);
		text = (String) table.getValueAt(row,1);
		T2.setText(text);  
							}
							}		
						
						}
					}
				});
				
				
			} catch (SQLException e) {
				System.out.println(e.getMessage() + "--> problem z polaczeniem");
			}
		

Moze mnie przez weekend olsni dlaczego nie dziala getOsoba (getObject)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1