[JAVA] Wybor w JTable

Odpowiedz Nowy wątek
2006-09-12 10:57

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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);

    }
}

Pozostało 580 znaków

2006-09-12 13:30

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

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

Pozostało 580 znaków

2006-09-13 10:14

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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

Pozostało 580 znaków

2006-09-13 11:10

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

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.

Pozostało 580 znaków

2006-09-13 11:33

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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]

Pozostało 580 znaków

2006-09-13 14:34

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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 ;-)

Pozostało 580 znaków

2006-09-13 19:02

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

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.

Pozostało 580 znaków

2006-09-14 07:57

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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 :-(

Pozostało 580 znaków

2006-09-14 12:14

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Chym dziwne ja robie tak w NetBeans i jest wszystko dobrze napewno 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 ;-)

Pozostało 580 znaków

2006-09-14 12:56

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

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.

Pozostało 580 znaków

2006-09-14 16:30

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

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

Pozostało 580 znaków

Odpowiedz

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