Ciao a tutti ragazzi,
ho un problema al quale sto dietro oramai da giorni, ma senza soluzione di sorta. Ho creato una JTable e relativo listener ove vorrei che una volta che l'utente riempia una cella, in quella accanto compaia un altro valore (lo prendo da un database, ma qui, per comodità , usiamo una semplice variabile String). Questo valore lo inserisco con una chiamata al metodo setValueAt. Il problema è che tale metodo non fa altro che richiamare a sua volta il listener creando un loop infinito! Ho provato a mettere una variabile di controllo, ma nulla. Vi posto l'intero codice:
Per onor di cronaca, ho già richiesto aiuto al forum ufficiale di java SUN, ma mi hanno consigliato di togliere il listener ed inserire una cosa del genere:
]
Potreste aiutarmi? Ci sto impazzendo dietro...
ho un problema al quale sto dietro oramai da giorni, ma senza soluzione di sorta. Ho creato una JTable e relativo listener ove vorrei che una volta che l'utente riempia una cella, in quella accanto compaia un altro valore (lo prendo da un database, ma qui, per comodità , usiamo una semplice variabile String). Questo valore lo inserisco con una chiamata al metodo setValueAt. Il problema è che tale metodo non fa altro che richiamare a sua volta il listener creando un loop infinito! Ho provato a mettere una variabile di controllo, ma nulla. Vi posto l'intero codice:
PHP:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.sql.*;
public class Vendita {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new VenditaFrame().setVisible(true);
}
});
}
}
class VenditaFrame extends JFrame {
private JScrollPane scrollPane;
private JTextField rowTextField;
private JTextField columnTextField;
private JButton ensureVisibleButton;
private JButton scrollButton;
private int row=0, column=0;
private JTextField campoQuantita; //campo col totale oggetti
private JTextField campoTotale; //campo di testo col totale acquisti
private int quantita = 0;
public VenditaFrame() {
super("Vendita al banco");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(800, 600);
campoQuantita = new JTextField(20);
campoQuantita.setEditable(false);
//dichiaro il tablemodel
final DefaultTableModel data = new DefaultTableModel();
//aggiungo al modello data le colonne
data.addColumn("Codice");
data.addColumn("Descrizione");
data.addColumn("Q.tà ");
data.addColumn("Prezzo unitario");
data.addColumn("Totale");
//numero di righe
data.setRowCount(99);
//dichiaro la tabella con i dati contenuti in data
final JTable table = new JTable(data);
scrollPane = new JScrollPane(table);
//table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setRowHeight(30);
table.setIntercellSpacing(new Dimension(8, 8));
//aggiungo un listener
data.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if(e.getType() == TableModelEvent.UPDATE) {
TableModel source = (TableModel)e.getSource();
int row = e.getFirstRow();
int col = e.getColumn();
Object value = source.getValueAt(row, col);
String prova="prova";//come fosse la query che mi restituisce il record del DB
data.setValueAt(prova, 3, 1); //E QUI CASCA L'ASINO....
quantita++;
campoQuantita.setText(Integer.toString(quantita));
//JOptionPane.showMessageDialog(table, cellaRicevuta);
}//fine di if
}//fine della inner class
}//fine del metodo addTableModelListener
);
//indica di andare nella prossima cella e non nella riga sotto
table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "selectNextColumnCell");
rowTextField = new JTextField(4);
rowTextField.setText("1234");
columnTextField = new JTextField(4);
columnTextField.setText("4");
ensureVisibleButton = new JButton("Bottone1");
scrollButton = new JButton("Bottone2");
JButton cancellaRigaBottone = new JButton("Cancella riga");
cancellaRigaBottone.setToolTipText("Cancella l'intera riga");
JButton cancellaTuttoBottone = new JButton ("Cancella tutto");
JButton intermBottone = new JButton("Intermediario");
JButton scontoBottone = new JButton("Sconto");
JButton abbuonoBottone = new JButton("Abbuono");
JButton fatturaBottone = new JButton("Fattura");
JButton esciBottone = new JButton("Esci");
//listener per exciBottone
esciBottone.addActionListener(
new ActionListener()
{
// pass query to table model
public void actionPerformed( ActionEvent event )
{
System.exit( 1 ); // terminate application
} // end actionPerformed
} // end ActionListener inner class
); // end call to addActionListener
JPanel pannelloAlto = new JPanel(new FlowLayout(FlowLayout.LEFT));
pannelloAlto.add(cancellaRigaBottone);
pannelloAlto.add(cancellaTuttoBottone);
pannelloAlto.add(intermBottone);
pannelloAlto.add(scontoBottone);
pannelloAlto.add(abbuonoBottone);
pannelloAlto.add(fatturaBottone);
pannelloAlto.add(esciBottone);
JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
controlPanel.add(new JLabel("Quantità "));
controlPanel.add(campoQuantita);
//controlPanel.add(rowTextField);
controlPanel.add(new JLabel("Totale Euro"));
controlPanel.add(columnTextField);
controlPanel.add(ensureVisibleButton);
controlPanel.add(scrollButton);
getContentPane().add(pannelloAlto, BorderLayout.NORTH);
getContentPane().add(scrollPane, BorderLayout.CENTER);
getContentPane().add(controlPanel, BorderLayout.SOUTH);
}//fine metodo VenditaFrame
} //fine classe Vendita
Per onor di cronaca, ho già richiesto aiuto al forum ufficiale di java SUN, ma mi hanno consigliato di togliere il listener ed inserire una cosa del genere:
PHP:
class MySumTableModel extends DefaultTableModel {
@override
public void setValueAt(value, row, column) {
super.setValueAt(value, row, column);
if (row != sumRow) {
setValueAt(getColumnSum(column), sumRow, column);
}
}
// prevent users to edit
@override
public boolean isEditable(...) {
return row != sumRow;
}
}
[/php
Potreste aiutarmi? Ci sto impazzendo dietro...