Recimo da imam neku tabelu (obichan JTable) i da u prvoj koloni imam prezimena ljudi. Kako odraditi pretrazivanje po prezimenima (npr. kliknem na neko "find" dugme, izleti neko g**** gde cu da ukucam prezime i kada se obavi trazenje, da mi fokusira tabelu na taj red gde je trazeno ime). Ako neko zna, josh vishe bi mi znachilo da se odradi pretrazivanje kao u winamp - u. Pomagajte ljudi. Hvala unapred.
pretrazivanje JTable-a - hitno!!!!
Zaključano
Zakačeno
JTable samo prikazuje ono sto sadrzi njen TableModel.
Znaci pretrazivanje vrsis u modelu, a da selektujes odredjeni red iskoristi metodu JTable.changeSelection().
pozzz.
Znaci pretrazivanje vrsis u modelu, a da selektujes odredjeni red iskoristi metodu JTable.changeSelection().
pozzz.
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
izmenjeno 1 put, poslednji put hyle 30.01.2007. u 13:36
Izmene poruke
- hyle30.01.2007. u 13:36zapis iz teksta poruke
Ok, evo shta sam ispisao, ali mi ne radi, jednostavno kada kliknem na dugme "find" ne deshava se nishta...
U chemu je problem? Mozda ne kapiram dobra rad sa tabelama ali bio sam primoran da ga sada nauchim. Pomagajte, imam fore do 6.-tog za taj seminarski...
Code:
public void actionPerformed(ActionEvent e) {
if (e.getObject().equals(findButton)) {
TableModel model = clientTable.getModel();
for (int i = 0; i < clientTable.getRowCount(); i ++)
if (model.getValueAt(i, 1).toString().equals(nekoPrezimeKojeTrazim))
clientTable.changeSelection(i, 1, false, false);
}
}
public void actionPerformed(ActionEvent e) {
if (e.getObject().equals(findButton)) {
TableModel model = clientTable.getModel();
for (int i = 0; i < clientTable.getRowCount(); i ++)
if (model.getValueAt(i, 1).toString().equals(nekoPrezimeKojeTrazim))
clientTable.changeSelection(i, 1, false, false);
}
}
U chemu je problem? Mozda ne kapiram dobra rad sa tabelama ali bio sam primoran da ga sada nauchim. Pomagajte, imam fore do 6.-tog za taj seminarski...
Ako su ti u prvoj koloni prezimena onda stavi
Postuj neko kompletnije parce koda koje moze da se pokrene pa cu ti onda moci vise pomoci.
pozzz
Code:
getValueAt(i, 0)
getValueAt(i, 0)
Postuj neko kompletnije parce koda koje moze da se pokrene pa cu ti onda moci vise pomoci.
pozzz
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
izmenjeno 1 put, poslednji put hyle 31.01.2007. u 13:12
Izmene poruke
- hyle31.01.2007. u 13:12zapis iz teksta poruke
Evo pogledaj. Uglavnom, treba da napravim sistem od dve tabele(server i klijent), i da klijentova funkcionishe tako shto se puni sa servera. E sad, ako se user loguje, i nije bilo izmena na serveru od userovog poslednjeg logOuta, client pravi tabelu sa svog harda (iz nekog TableModela koji smo sachuvali u nekom file-u). Ako je bilo izmena, client moze da pravi celu tabelu iz serverovog modela, ili da napravi tabelu iz svog modela na hardu, a onda da trazi od servera sve izmene od poslednjeg logOuta (ovo je teze ali je i praktichnije). Imash u TableMaker-u (u mom kodu) pod komentarom kako sam ovo zamislio. Kod je malo shugaviji, ali jebiga, non stop sam neshto prepravljao i pokushavao. E, da, glavni trip je u tome da kada server shalje informacije klijentu, MORA da ih shalje u obliku stringa i to na ovu foru: petrovic:marko:178:74:23:04:1985. Kapirash, sve podatke jednog reda tabele treba da spakuje u ovo. Ako si upucen u FIX protocol bice ti jasno, mada nije ni bitno, skapiracesh kako se to sve obavlja. Ovo shto vidish u trecoj koloni (new Date()), tu u stvari treba da stoji datum kada je poslednji put neshto izmenjeno. Ako imash vremena, reshi mi problem sa upload-ovanjem clientove tabele(daj mi samo ideju ili pseudo), onaj changeSelection() od ranije, i to je to. Ako mislish da imash josh neke korisne informacije, slusham te....
Pozdrav, hvala unapred.
Pozdrav, hvala unapred.
Code:
/*
* SimpleTableDemo.java is a 1.4 application that requires no other files.
*/
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.event.*;
import javax.swing.table.TableModel;
import java.awt.Color;
import javax.swing.JTextField;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
public TableMaker() {
super(new GridLayout(4,0));
String[] columnNames = {"Company Name",
"Equity Price",
"No Changes Since:"};
Object[][] data = {
{"Uzas", new Integer(5000), new Date()},
{"Bedak", new Integer(15000), new Date()},
{"Smor", new Integer(13000), new Date()},
{"Katastrofa", new Integer(13000), new Date()},
{"Blejanje", new Integer(11500), new Date()}
};
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
textField = new JTextField("Search");
serverTable = new JTable(data, columnNames);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
serverTable.getModel().addTableModelListener(this);
clientTable = new JTable(serverTable.getRowCount(), serverTable.getColumnCount());
clientTable.setSelectionBackground(Color.BLUE);
//Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
//Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/*
* SimpleTableDemo.java is a 1.4 application that requires no other files.
*/
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.event.*;
import javax.swing.table.TableModel;
import java.awt.Color;
import javax.swing.JTextField;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
public TableMaker() {
super(new GridLayout(4,0));
String[] columnNames = {"Company Name",
"Equity Price",
"No Changes Since:"};
Object[][] data = {
{"Uzas", new Integer(5000), new Date()},
{"Bedak", new Integer(15000), new Date()},
{"Smor", new Integer(13000), new Date()},
{"Katastrofa", new Integer(13000), new Date()},
{"Blejanje", new Integer(11500), new Date()}
};
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
textField = new JTextField("Search");
serverTable = new JTable(data, columnNames);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
serverTable.getModel().addTableModelListener(this);
clientTable = new JTable(serverTable.getRowCount(), serverTable.getColumnCount());
clientTable.setSelectionBackground(Color.BLUE);
//Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
//Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Znaci u vezi ovog pozicioniranja evo pogledaj:
Dok budes kucao u JTextField-u tako ce ti se selektovati odgovarajuci red (onaj cija se prva kolona poklapa).
Nije mi jasno zasto kod tebe nije radilo.
Evo ti mali savet:
1. Koristi anonimne klase za event-e
2. Nemoj citav kod trpati u jednu klasu, vec razdvoji (npr. napravi custom TableModel i stavi ga u posebnu klasu).
3. Pogledaj malo layout manager-e (mada pretpostavljam da ti je ovo samo test klasa pa ti nije vazan izgled)
pozz
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Date;
import javax.swing.event.*;
import javax.swing.table.TableModel;
import java.awt.Color;
import javax.swing.JTextField;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
public TableMaker() {
super(new GridLayout(4,0));
String[] columnNames = {"Company Name",
"Equity Price",
"No Changes Since:"};
Object[][] data = {
{"Uzas", new Integer(5000), new Date()},
{"Bedak", new Integer(15000), new Date()},
{"Smor", new Integer(13000), new Date()},
{"Katastrofa", new Integer(13000), new Date()},
{"Blejanje", new Integer(11500), new Date()}
};
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
textField = new JTextField("Search");
textField.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e) {
String str = textField.getText().trim().toLowerCase();
for(int i=0; i<serverTable.getRowCount(); i++){
String ssttrr = serverTable.getValueAt(i, 0).toString();
if(ssttrr.trim().toLowerCase().startsWith(str)){
serverTable.changeSelection(i, 0, false, false);
break;
}
}
}
});
serverTable = new JTable(data, columnNames);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
serverTable.getModel().addTableModelListener(this);
clientTable = new JTable(serverTable.getRowCount(), serverTable.getColumnCount());
clientTable.setSelectionBackground(Color.BLUE);
// Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
// Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Date;
import javax.swing.event.*;
import javax.swing.table.TableModel;
import java.awt.Color;
import javax.swing.JTextField;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
public TableMaker() {
super(new GridLayout(4,0));
String[] columnNames = {"Company Name",
"Equity Price",
"No Changes Since:"};
Object[][] data = {
{"Uzas", new Integer(5000), new Date()},
{"Bedak", new Integer(15000), new Date()},
{"Smor", new Integer(13000), new Date()},
{"Katastrofa", new Integer(13000), new Date()},
{"Blejanje", new Integer(11500), new Date()}
};
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
textField = new JTextField("Search");
textField.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e) {
String str = textField.getText().trim().toLowerCase();
for(int i=0; i<serverTable.getRowCount(); i++){
String ssttrr = serverTable.getValueAt(i, 0).toString();
if(ssttrr.trim().toLowerCase().startsWith(str)){
serverTable.changeSelection(i, 0, false, false);
break;
}
}
}
});
serverTable = new JTable(data, columnNames);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
serverTable.getModel().addTableModelListener(this);
clientTable = new JTable(serverTable.getRowCount(), serverTable.getColumnCount());
clientTable.setSelectionBackground(Color.BLUE);
// Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
// Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Dok budes kucao u JTextField-u tako ce ti se selektovati odgovarajuci red (onaj cija se prva kolona poklapa).
Nije mi jasno zasto kod tebe nije radilo.
Evo ti mali savet:
1. Koristi anonimne klase za event-e
2. Nemoj citav kod trpati u jednu klasu, vec razdvoji (npr. napravi custom TableModel i stavi ga u posebnu klasu).
3. Pogledaj malo layout manager-e (mada pretpostavljam da ti je ovo samo test klasa pa ti nije vazan izgled)
pozz
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
Ovo mi je samo test, zato je grozno i pogano. Uglavnom, ovo shto si mi uradio je od ogromne pomoci. Hvala ti puno, ako mi zatreba neka pomoc, cimacu te opet. Pozdrav
Brate, ako nisi u nekoj guzvi, jel ti nije frka da mi napishesh kako da dodam listenere za dodavanje novih vrsta i kolona (kada se na serveru doda nova vrsta (ili kolona) da klijent to automatski detektuje i doda na svojoj tabeli).
izmenjeno 1 put, poslednji put Toxter 01.02.2007. u 20:04
Izmene poruke
- Toxter01.02.2007. u 20:04zapis iz teksta poruke
Evo recimo ovako nesto:
Pozzz
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
Vector tableData = new Vector();
int cnt = 0;
public TableMaker() {
super(new GridLayout(5,0));
Vector data = new Vector();
Vector names = new Vector();
names.add("Company Name");
names.add("Equity Price");
names.add("No Changes Since:");
Vector row = new Vector();
row.add("Uzas");
row.add(new Integer(5000));
row.add(new Date());
data.add(row);
row = new Vector();
row.add("Bedak");
row.add(new Integer(15000));
row.add(new Date());
data.add(row);
row = new Vector();
row.add("Blejanje");
row.add(new Integer(115000));
row.add(new Date());
data.add(row);
MyModel tableModel = new MyModel(data, names);
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
JButton addRowBtn = new JButton("Add row");
addRowBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Vector row = new Vector();
row.add("Novo"+ (++cnt));
row.add(new Integer(5000+cnt));
row.add(new Date());
MyModel mdl = (MyModel)serverTable.getModel();
mdl.getData().add(row);
serverTable.tableChanged(null);
serverTable.firePropertyChange("dodatNoviRed", 0, mdl.getData().indexOf(row));
}
});
textField = new JTextField("Search");
textField.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e) {
String str = textField.getText().trim().toLowerCase();
for(int i=0; i<serverTable.getRowCount(); i++){
String ssttrr = serverTable.getValueAt(i, 0).toString();
if(ssttrr.trim().toLowerCase().startsWith(str)){
serverTable.changeSelection(i, 0, false, false);
break;
}
}
}
});
serverTable = new JTable(tableModel);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
clientTable = new JTable(new MyModel(new Vector(),names));
clientTable.setSelectionBackground(Color.BLUE);
serverTable.addPropertyChangeListener("dodatNoviRed", new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
int row = ((Integer) evt.getNewValue()).intValue();
MyModel clientModel = (MyModel)clientTable.getModel();
MyModel serverModel = (MyModel)serverTable.getModel();
clientModel.getData().add(serverModel.getData().get(row));
clientTable.tableChanged(null);
}
});
// Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
// Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
add(addRowBtn);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
class MyModel extends AbstractTableModel{
private Vector data = new Vector();
private Vector names = new Vector();;
public MyModel(Vector data, Vector names){
this.data = data;
this.names = names;
}
public int getColumnCount() {
return names.size();
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int column) {
return names.get(column).toString();
}
public Object getValueAt(int row, int column) {
Vector oneRow = (Vector)data.get(row);
return oneRow.get(column).toString();
}
public Vector getData() {
return data;
}
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class TableMaker extends JPanel implements ActionListener, TableModelListener {
JTable clientTable;
JTable serverTable;
JButton copyButton;
TableModel model;
JTextField textField;
Vector tableData = new Vector();
int cnt = 0;
public TableMaker() {
super(new GridLayout(5,0));
Vector data = new Vector();
Vector names = new Vector();
names.add("Company Name");
names.add("Equity Price");
names.add("No Changes Since:");
Vector row = new Vector();
row.add("Uzas");
row.add(new Integer(5000));
row.add(new Date());
data.add(row);
row = new Vector();
row.add("Bedak");
row.add(new Integer(15000));
row.add(new Date());
data.add(row);
row = new Vector();
row.add("Blejanje");
row.add(new Integer(115000));
row.add(new Date());
data.add(row);
MyModel tableModel = new MyModel(data, names);
copyButton = new JButton("Copy");
copyButton.addActionListener(this);
JButton addRowBtn = new JButton("Add row");
addRowBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Vector row = new Vector();
row.add("Novo"+ (++cnt));
row.add(new Integer(5000+cnt));
row.add(new Date());
MyModel mdl = (MyModel)serverTable.getModel();
mdl.getData().add(row);
serverTable.tableChanged(null);
serverTable.firePropertyChange("dodatNoviRed", 0, mdl.getData().indexOf(row));
}
});
textField = new JTextField("Search");
textField.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e) {
String str = textField.getText().trim().toLowerCase();
for(int i=0; i<serverTable.getRowCount(); i++){
String ssttrr = serverTable.getValueAt(i, 0).toString();
if(ssttrr.trim().toLowerCase().startsWith(str)){
serverTable.changeSelection(i, 0, false, false);
break;
}
}
}
});
serverTable = new JTable(tableModel);
serverTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
clientTable = new JTable(new MyModel(new Vector(),names));
clientTable.setSelectionBackground(Color.BLUE);
serverTable.addPropertyChangeListener("dodatNoviRed", new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
int row = ((Integer) evt.getNewValue()).intValue();
MyModel clientModel = (MyModel)clientTable.getModel();
MyModel serverModel = (MyModel)serverTable.getModel();
clientModel.getData().add(serverModel.getData().get(row));
clientTable.tableChanged(null);
}
});
// Create the scroll pane and add the table to it.
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
JScrollPane clientTableScrollPane = new JScrollPane(clientTable);
// Add the scroll pane to this panel.
add(serverTableScrollPane);
add(textField);
add(clientTableScrollPane);
add(copyButton);
add(addRowBtn);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(copyButton)) {
for(int i = 0; i < serverTable.getRowCount(); i ++)
for(int j = 0; j < serverTable.getColumnCount(); j ++)
clientTable.setValueAt(serverTable.getValueAt(i, j), i, j);
}
/*if (e.getSource().equals(sortButton)) {
TableSorter sorter = new TableSorter(new TableMaker());
clientTable = new JTable(sorter);
sorter.setTableHeader(clientTable.getTableHeader());
}
*/
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object changedData = model.getValueAt(row, column);
/*
* npr. na klijentu stavimo promenljivu lastLogOut, tipa Date(), koja dobija
* odgovarajucu vrednost svaki put kada se user izloguje sa servera.
* To uporedjuje sa serverovom promenljivom lastDataChange, i ako je lastDataChange
* obavljen nakon poslednjeg logOuta, user uzima podatke sa servera. Ako ne, user
* pravi tabelu iz sopstvenog TableModel-a koji bi nekako trebalo serijalizovati i
* chuvati na lokalnoj mashini.
*
* Ako je user kojim sluchajem konektovan, a u medjuvremenu dodje do promene podataka,
* server odmah shalje fix poruke do klijenta. Sve se obavlja kroz uporedjivanje
* pomenuta 2 datuma.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
TableMaker newContentPane = new TableMaker();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
class MyModel extends AbstractTableModel{
private Vector data = new Vector();
private Vector names = new Vector();;
public MyModel(Vector data, Vector names){
this.data = data;
this.names = names;
}
public int getColumnCount() {
return names.size();
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int column) {
return names.get(column).toString();
}
public Object getValueAt(int row, int column) {
Vector oneRow = (Vector)data.get(row);
return oneRow.get(column).toString();
}
public Vector getData() {
return data;
}
}
}
Pozzz
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
Toxter, samo da ti se zahvalim, poprilichno si imao udela u mojoj juche upisanoj 10 - ki. Hvala ti josh jednom...
No problemo.
Drago mi je ako sam pomogao
Drago mi je ako sam pomogao
Potpis
Sad mu nije nista, ubio si ga k'o zeca...