Problem z gui - zarządzanie rekordami

Problem z gui - zarządzanie rekordami
FI
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 13 lat
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

Kopiuj
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 :/

lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 12 lat
0

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

PS:

Dlaczego tworzysz taki obiekt

Kopiuj
Object[][] data

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

FI
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 13 lat
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.

lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 12 lat
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 [][].

FI
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 13 lat
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

Kopiuj
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.

lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 12 lat
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

Kopiuj
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

Kopiuj
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

Kopiuj
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

Kopiuj
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.

FI
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 13 lat
0

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

lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 12 lat
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.