Problem z gui - zarządzanie rekordami

0

Witam,
mam teoretyczny problem.

Listuje sobie rekordy z bazy w tabli (JTable). Chciałbym nimi zarządzać. Np. do każdego rekordu dodać guzik. Usuń/edytuj. W jaki sposób to rozwiązać ?

Na chwilę obecną mam coś takiego

ClientTools ct = new ClientTools(conn);
    		java.util.List clients = ct.getClients();
    		Object[][] data = new Object[clients.size()][4];
    		for(int i = 0; i < clients.size(); i++) {
    			Client client = (Client)clients.get(i);
    			System.out.println(client.getName());
    			data[i][0] = client.getUid();
    			data[i][1] = client.getName();
    			data[i][2] = client.getSurname();
    			data[i][3] = client.getTel();
    			
    		}

No i to ślicznie tworzy tą tabelkę, ale teraz nie mam pojęcia jak dobrać się do tych rekordów :/

0

może to Ci trochę pomoże
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

PS:

Dlaczego tworzysz taki obiekt

Object[][] data

Podejrzewam, że używasz go w modelu tabeli. Jesli tak, to po co, skoro masz już listę klientów?

0

zaraz się zapoznam z linkiem. Odpowiadając na Twoje pytanie. Dlatego, że myślałem, że tak trzeba. Jasne mam listę z obiektami Client i myślałem, że trzeba to przepiąć w ten sposób.

0

Stwórz sobie własny model danych dla tabeli rozszerzając klasę AbstractTableModel. Tam umieścisz listę klientów i nie będziesz musiał jej przerzucać do tablicy [][].

0
lemmiwink napisał(a)

może to Ci trochę pomoże
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

PS:

Dlaczego tworzysz taki obiekt

Object[][] data

Podejrzewam, że używasz go w modelu tabeli. Jesli tak, to po co, skoro masz już listę klientów?

Szczerze to nie wiem jak ma mi to pomóc. Może coś przeoczyłem.

Nadal nie wiem jak stworzyć dla każdego rekordu (obok niego) guzik, który będzie miał przypisaną akcje tylko dla tego jednego rekordu.

0

Poniżej masz przykład jak stworzyć własnego CellRenderera, za pomocą którego można wyświetlać w komórkach dowolne rzeczy oraz przykład własnego modelu danych dal tabeli:

Dummy.java

public class Dummy {
	private int i;
	private String s;
	
	public Dummy(String s, int i) {
		this.s = s;
		this.i = i;		
	}
	
	public void setS(String s) {
		this.s = s;
	}
	public String getS() {
		return s;
	}
	public void setI(int i) {
		this.i = i;
	}
	public int getI() {
		return i;
	}
}

MyTableModel.java

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;


public class MyTableModel extends AbstractTableModel {
	
	List<Dummy> list;
	
	public MyTableModel() {
		list = new ArrayList<Dummy>();
		// zainicjowanie jakimis danymi
		list.add(new Dummy("A", 1));
		list.add(new Dummy("B", 2));
		list.add(new Dummy("C", 3));
		list.add(new Dummy("D", 4));
	}
	
	@Override
	public int getColumnCount() {
		return 3; //beda 3 kolumy: 2 na pola z Dummy oraz na przycisk
	}

	@Override
	public int getRowCount() {
		return list.size();
	}

	@Override
	public Object getValueAt(int x, int y) {
		switch (y) {
		case 0:
			return list.get(x).getS();
		case 1:
			return list.get(x).getI();
		default:
			return null;
		}
		
	}
}

MyCellRenderer.java

import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class MyCellRenderer extends DefaultTableCellRenderer  {
	
	JButton button = new JButton("Press");	
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		if (hasFocus) {
			setBorder(BorderFactory.createLineBorder(Color.YELLOW, 1));
		} else {
			setBorder(null);
		}
		switch (column) {
		case 0:
		case 1:
			setBackground(Color.LIGHT_GRAY);
			setText(value.toString());
			break;
		case 2:
			return button;
		}
		return this;
	}
}

MainClass.java

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;


public class MainClass extends JFrame {
	
	public static void main(String[] args) {
		JFrame thisClass = new MainClass();
		
		TableCellRenderer cellRenderer = new MyCellRenderer();
		TableModel model = new MyTableModel();
		JTable table = new JTable(model);
		//ustawianie rendererow kolumn
		for (int i = 0; i < table.getColumnCount(); i++) {
			table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
		}
		thisClass.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		thisClass.add(table);
		thisClass.setSize(250, 120);
		thisClass.setVisible(true);
	}
}

Jednak nie będziesz miał możliwości klikania w przyciski - będą tylko wyświetlone. Aby zasymulować ich naciśnięcie trzeba pokombinować bodajże z TableCellEditor i MouseListenerem.

0

To trochę sporo zachodu jak na jedno kliknięcie :P
Może ja źle do tego podchodzę i niepotrzebnie pakuje wszystko do tabeli.

0

to zależy też od tego ile tych danych będzie.
Jeśli kila,kilkanaście wierszy to może warto tworzyć oddzielne komponenty dla każdego wiersza (mam na myśli labelki, przysiski itp.) Ale jeśli jest tego dużo to tabela (lub lista) będzie chyba najlepszym rozwiązaniem.

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