Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Já Vánoce juchuchu
oslavím na Lopuchu!

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub Programování [ŽP: neomezená] (kategorie Programování) moderuje tvx.
Archiv
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: ozehopl
[ 857 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
dodanek Dodanek 22.5.2011 09:13  1265
Moc děkuju. Celý to ztroskotává asi v celym návrhu (kterej dělala Alenka Buchalcevová), ve kterym v tý gui třídě, která drží tabulku a tlačítka, není o existenci nějaký evidence ani tušení. Já se v tom nějak porejpu, ten příklad mi pomůže :)
huh huh 22.5.2011 01:47  1264
Tady je spustitelný příklad. Je to narychlo zbastlený do příkladu na řazení JTable podle sloupců toho si nevšímej. Data to na disk nezapisuje/nečte, ale je to na to připravený (pomocí serializace -- v zásadě mnohem jednodušší než se patlat s tím ručně).
huh huh 22.5.2011 01:39  1263
Tohle:

class DeleteZamestnanecActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

EvidenceZamestnancu temp = new EvidenceZamestnancu();
TableZamestnanec.addTableModelListener(evidenceTable);
temp.nactiSeznam();

temp.deletePolozka(temp.getPolozka(vybranyRadek));

temp.ulozSeznam();
}

je celý nějaká blbost.

MVC u JTable funguje (zjednodušeně pro tenhle příklad) takhle:
1) máš svůj byznys objekt, v tvém případě instanci EvidenceZamestnancu. Tu vytvoříš na začátku programu. Žádnou jinou instanci už během programu nevytváříš! (Leda bys chtěl mít několik navzájem nezávislých evidencí.)
2) Tu zobrazuješ pomocí instancí JTable (ty fungují jako View a Controller). V našem případě je jen jedna, ale mohlo by jich být více.
3) Jenomže JTable nezná naši evidenci zaměstnanců. Co s tím? Vytvoříme 1 instanci Modelu, který zapouzdří 1 instanci naší evidence. Modelem je myšlena naše vlastní třída implementující TableModel.
4) chceme-li pak např. mít tlačítko, které smaže řádek vybraný v tabulce. Jak na to? Do Modelu přidáme např. metodu odeber. Ta udělá dvě věci: a) řekne instanci EvidenceZamestnancu (té kterou si drží od začátku, žádnou další už si nevytváří!), aby záznam odebrala; b) zavolá fireXXX, v tomto případě fireTableRowsDeleted, aby se přihlášené instance View (JTable) dozvěděly o změně. V obsluze tlačítka pak jenom zavoláme odeber Modelu a předáme mu číslo mazaného řádku. Nějak takhle:
        JButton b = new JButton("Delete");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (tab.getSelectedRowCount() > 0) {
                    ((DatovyModel)tab.getModel()).odeber(tab.getSelectedRows()[0]);                    
                }
            }
        });
Zapamatovat si: 1 instance byznys objektu, 1 instance modelu, libovolné množství instancí JTable.
dodanek Dodanek 21.5.2011 23:32  1262
Podle dokumentace by to, co potřebuju, měla dělat metoda

fireTableDataChanged

public void fireTableDataChanged()
Notifies all listeners that all cell values in the table's rows may have changed. The number of rows may also have changed and the JTable should redraw the table from scratch. The structure of the table (as in the order of the columns) is assumed to be the same.

Nicméně tu, co tam mám, musim taky nějak naimplementovat, ale vůbec netuším, jak.
dodanek Dodanek 21.5.2011 23:25  1261
No nic, já na to seru. Pokud by někdo byl tak boží a našel v tom mou chybu, nabízím sestru a půl království. Nejsem si úplně jistej, co je přesně to "e" u tableChanged, možná v tom tkví chyba.


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gui;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import logika.EvidenceZamestnancu;
import logika.Zamestnanec;

/**
*
* @author Ondra
*/
public class TableZamestnanec extends AbstractTableModel implements TableModelListener {

private EvidenceZamestnancu evidence;
String[] zahlaviSloupcu = {"ID", "Jmeno", "Prijmeni", "Práce", "Rodné číslo", "Telefon", "Adresa"};

public TableZamestnanec(EvidenceZamestnancu evidence) {
this.evidence = evidence;
}

@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

@Override
public String getColumnName(int col) {
return zahlaviSloupcu[col];
}

public int getRowCount() {
return evidence.pocet();
}

public int getColumnCount() {
return 7;
}

public Object getValueAt(int row, int col) {
// naplneni seznamu

Zamestnanec polozka = (Zamestnanec) evidence.getPolozka(row);
switch (col) {
case 0:
return (polozka.getID());
case 1:
return (polozka.getJmeno());
case 2:
return (polozka.getPrijmeni());
case 3:
return (polozka.getPrace());
case 4:
return (polozka.getRodneCislo());
case 5:
return (polozka.getTelefon());
case 6:
return (polozka.getAdresa());
default:
return null;
}

}

public void tableChanged(TableModelEvent e) {
evidence.nactiSeznam();
fireTableChanged(e);

}
}

----------------------------------------------------------------


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
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.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import logika.EvidenceZamestnancu;
import logika.Zamestnanec;

/**
*
* @author Ondra
*/
public class OknoZamestnanec {

private JFrame OknoZamestnanecFrame;
private JPanel westPanel;
private JPanel centerPanel;
private JButton newButton;
private JButton editButton;
private JButton deleteButton;
private JButton backButton;
private JPanel mistoPanel;
private JTextField zobrazTextField;
private Menu menu;
private NewZamestnanec newZamestnanec;
private TableModel TableZamestnanec;
private JTable evidenceTable;
private int vybranyRadek;

public OknoZamestnanec(TableModel model) {
this.TableZamestnanec = model;
init();
setVisible(true);

}

private class VyberRadku implements ListSelectionListener {

public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (!lsm.isSelectionEmpty()) {
vybranyRadek = lsm.getMinSelectionIndex();
}
zobrazTextField.setText((String) TableZamestnanec.getValueAt(vybranyRadek, 1));
}
}

/**
* Metoda inicializuje a propojuje jednotlivé komponenty GUI
*/
private void init() {

OknoZamestnanecFrame = new JFrame();
menu = new Menu();

OknoZamestnanecFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
OknoZamestnanecFrame.setTitle("Evidence Zaměstnanců");
OknoZamestnanecFrame.setSize(700, 400);
OknoZamestnanecFrame.setLocation(200, 200);
OknoZamestnanecFrame.setJMenuBar(menu);
OknoZamestnanecFrame.setResizable(false);

westPanel = new JPanel();


westPanel.setLayout(new FlowLayout());
westPanel.setPreferredSize(new Dimension(140, 400));
newButton = new JButton("Nový");
newButton.addActionListener(new NewZamestnanecActionListener());
editButton = new JButton("Edit");
deleteButton = new JButton("Smaž");
deleteButton.addActionListener(new DeleteZamestnanecActionListener());

backButton = new JButton("Zpět");
backButton.addActionListener(new BackActionListener());

newButton.setPreferredSize(new Dimension(120, 25));
editButton.setPreferredSize(new Dimension(120, 25));
deleteButton.setPreferredSize(new Dimension(120, 25));
backButton.setPreferredSize(new Dimension(120, 25));


mistoPanel = new JPanel();
mistoPanel.setPreferredSize(new Dimension(140, 210));


westPanel.add(newButton);
westPanel.add(editButton);
westPanel.add(deleteButton);
westPanel.add(mistoPanel);
westPanel.add(backButton);




evidenceTable = new JTable(TableZamestnanec);
evidenceTable.setPreferredScrollableViewportSize(new Dimension(540, 400));
evidenceTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel modelVyberu = evidenceTable.getSelectionModel();

modelVyberu.addListSelectionListener(new VyberRadku());
JScrollPane scpRoluj = new JScrollPane(evidenceTable);
OknoZamestnanecFrame.add(scpRoluj, BorderLayout.CENTER);
zobrazTextField = new JTextField(30);
// OknoZamestnanecFrame.add(zobrazTextField, BorderLayout.SOUTH);

OknoZamestnanecFrame.add(westPanel, BorderLayout.WEST);

}

class BackActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
setVisible(false);
}
}

class DeleteZamestnanecActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

EvidenceZamestnancu temp = new EvidenceZamestnancu();
TableZamestnanec.addTableModelListener(evidenceTable);
temp.nactiSeznam();

temp.deletePolozka(temp.getPolozka(vybranyRadek));

temp.ulozSeznam();
}
}

class NewZamestnanecActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

NewZamestnanec newZamestnanec = new NewZamestnanec();
newZamestnanec.setVisible(true);
}
}

/**
* Metoda, která zviditelňuje GUI
* @param viditelnost GUI
*/
public void setVisible(boolean viditelnost) {
OknoZamestnanecFrame.setVisible(viditelnost);
}
}
dodanek Dodanek 21.5.2011 22:50  1260
TableZamestnanec.addTableModelListner(evidenceTable); nefunguje jenom proto, že jsem kokot a neumim napsat Listener. Jinak když tomu dám tu tabulku, tak se to přeloží, ale stejně to furt nejede :(
dodanek Dodanek 21.5.2011 22:44  1259
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.event.ActionEvent cannot be cast to javax.swing.event.TableModelListener, překvapivě. Takže tohle je taky píčovina :)
dodanek Dodanek 21.5.2011 22:43  1258
TableZamestnanec.addTableModelListener((TableModelListener) e);

se mi přeloží, ale padá mi to .. vyzkoumám proč
dodanek Dodanek 21.5.2011 22:29  1257
JTable. Pochopil jsem tak prikaz "predej tomu tu tabulku" :)

jeste me napadlo druhy reseni:
evidenceTable.setModel(TableZamestnanec); (misto predavani modelu v konstruktoru), ale to mi pada .. deklarace v modelu je takovahle:

public void setModel(TableModel model) {
this.model = model;
this.addTableModelListener(this);
}
tessien Tessien Of course slavery is the worst thing - that ever happened. But maybe... 21.5.2011 22:20  1256
Dodanek [1255]: jakyho typu je "evidenceTable" z "TableZamestnanec.addTableModelListner(evidenceTable);"?
dodanek Dodanek 21.5.2011 22:14  1255
public class TableZamestnanec extends AbstractTableModel implements TableModelListener {

public void tableChanged(TableModelEvent e) {
evidence.nactiSeznam();
fireTableChanged(e);
}

a tak okolo ..

a v okně, kde je tabulka,
TableZamestnanec.addTableModelListner(evidenceTable);
(což nefunguje, ta metoda tam údajně není) ..

mám pocit, že v tom prvním tomu musim předat nějakej konkrétní event, ale nevim, jakej ..

a s tím druhým si absolutně nevím rady

a připadám si jako debil opravdu velice :D
dodanek Dodanek 21.5.2011 22:09  1254
Tak. Dospěl jsem do fáze, kdy slovo od slova chápu, co mi poradil Tessien, jen to prostě kurva zase nefunguje :D a to googlím o život a snažím se pobrat různý příklady ..
dodanek Dodanek 21.5.2011 21:40  1253
Jasně, už to pobírám .. implements TableModelListener je ta kouzelná fráze :)
operator304 21.5.2011 21:37  1252
Ta uz tam je, ty ji jenom pouzijes zpusobem, kterej ti pred chvili popsal Tess
dodanek Dodanek 21.5.2011 21:36  1251
Uááá, neříkejte mi, že potřebuju observer, to je jedna z věcí, kterou prostě nikdy nepochopim, jak ji mám naimplementovat :D

[ 857 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt