|
[ trodon @ 29.01.2007. 10:07 ] @
| 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. |
[ Toxter @ 29.01.2007. 11:15 ] @
JTable samo prikazuje ono sto sadrzi njen TableModel.
Znaci pretrazivanje vrsis u modelu, a da selektujes odredjeni red iskoristi metodu JTable.changeSelection().
pozzz.
[ trodon @ 30.01.2007. 10:15 ] @
Ok, evo shta sam ispisao, ali mi ne radi, jednostavno kada kliknem na dugme "find" ne deshava se nishta...
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);
}
}
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...
[Ovu poruku je menjao hyle dana 30.01.2007. u 13:36 GMT+1]
[ Toxter @ 30.01.2007. 10:53 ] @
Ako su ti u prvoj koloni prezimena onda stavi
Code: getValueAt(i, 0)
Postuj neko kompletnije parce koda koje moze da se pokrene pa cu ti onda moci vise pomoci.
pozzz
[ trodon @ 31.01.2007. 10:44 ] @
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.
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();
}
});
}
}
[Ovu poruku je menjao hyle dana 31.01.2007. u 13:12 GMT+1]
[ Toxter @ 31.01.2007. 16:42 ] @
Znaci u vezi ovog pozicioniranja evo pogledaj:
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();
}
});
}
}
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
[ trodon @ 31.01.2007. 19:58 ] @
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
[ trodon @ 01.02.2007. 11:44 ] @
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).
[ Toxter @ 01.02.2007. 18:51 ] @
Evo recimo ovako nesto:
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;
}
}
}
Pozzz
[Ovu poruku je menjao Toxter dana 01.02.2007. u 20:04 GMT+1]
[ trodon @ 13.02.2007. 10:44 ] @
Toxter, samo da ti se zahvalim, poprilichno si imao udela u mojoj juche upisanoj 10 - ki. Hvala ti josh jednom...
[ Toxter @ 13.02.2007. 17:15 ] @
No problemo.
Drago mi je ako sam pomogao 
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|