PDA

Visualizza la versione completa : [JAVA] Update jtable


pedroriky
25-03-2004, 10:12
Ciao
ho una jtable con una colonna formata da bottoni che mi aprono un frame che contiene dei textfield che assumono il valore dei campi della riga selezionata.Il mio scopo quello di poter cambiare tali valori e aggiornare la table.Mi sapreste aiutare?
Vi posto il codice.


class FrameTabellaFile3 implements TableCellRenderer {
private TableCellRenderer defaultRenderer;

public FrameTabellaFile3(TableCellRenderer renderer) {
defaultRenderer = renderer;
}

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
if(value instanceof Component)
return (Component)value;
return defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
}

class JTableButtonModel extends AbstractTableModel {
private Object[][] rows = {
{ "One", "One",new JButton("Button One") },
{ "Two", "One",new JButton("Button Two") },
{ "Three","One", new JButton("Button Three") },
{ "Four","One", new JButton("Button Four") }
};

private String[] columns = { "Numbers", "Buttons","PROVA" };
public String getColumnName(int column) {
return columns[column];
}

public int getRowCount() {
return rows.length;
}

public int getColumnCount() {
return columns.length;
}

public Object getValueAt(int row, int column) {
return rows[row][column];
}

public boolean isCellEditable(int row, int column) {
return false;
}

public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}




class JTableButtonMouseListener implements MouseListener {
private JTable tableListener;
private JDialog dialog;
private JFrame frm;
private JTextField txtCol0;
private JTextField txtCol1;
private JButton btn_Salva;
public void clickOpenDialog(MouseEvent e) {
MouseEvent buttonEvent;
tableListener.getColumnName(0);

frm = new JFrame();
JLabel lblCol0 = new JLabel();
JLabel lblCol1 = new JLabel();
lblCol0.setSize(50,50);
lblCol1.setSize(50,50);
txtCol0 = new JTextField();
txtCol1 = new JTextField();
btn_Salva = new JButton();
btn_Salva.setText("SALVA");
btn_Salva.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
btn_Salva_actionPerformed(e);
}
});
txtCol0.setSize(100,20);
txtCol1.setSize(100,20);
txtCol0.setText(tableListener.getValueAt(tableList ener.getSelectedRow(),0).toString());
txtCol1.setText(tableListener.getValueAt(tableList ener.getSelectedRow(),1).toString());
txtCol0.setSize(100,20);
txtCol1.setSize(100,20);

JPanel pan = new JPanel();
GridLayout layout = new GridLayout(3,2);
lblCol0.setText(tableListener.getColumnName(0));
lblCol1.setText(tableListener.getColumnName(1));
btn_Salva.setSize(100,20);

pan.add(lblCol0);
pan.add(txtCol0);
pan.add(lblCol1);
pan.add(txtCol1);
pan.add(btn_Salva);
pan.setLayout(layout);

frm.getContentPane().add(pan);
frm.pack();
frm.setVisible(true);
}

private void btn_Salva_actionPerformed(ActionEvent e)
{

int nRow = tableListener.getSelectedRow();
tableListener.setValueAt(txtCol0.getText(),nRow,0) ;
tableListener.setValueAt(txtCol1.getText(),nRow,1) ;

tableListener.repaint();
System.out.println(tableListener.getValueAt(tableL istener.getSelectedRow(),0).toString());
frm.dispose();
}
public JTableButtonMouseListener(JTable table) {
tableListener = table;
}

public void mouseClicked(MouseEvent e) {
//solo la colonna del bottone aziona il dialog.DA MIGLIORARE!!
if(tableListener.getSelectedColumn()==2)
clickOpenDialog(e);
}

public void mousePressed(MouseEvent e) {


}
public void mouseExited(MouseEvent e) {

}
public void mouseEntered(MouseEvent e) {

}
public void mouseReleased(MouseEvent e) {

}


}




final class JTableButton extends JFrame {
private JTable table;
private JScrollPane scrollPane;

public JTableButton() {
super("JTableButton Demo");
TableCellRenderer defaultRenderer;

table = new JTable(new JTableButtonModel());
defaultRenderer = table.getDefaultRenderer(JButton.class);
table.setDefaultRenderer(JButton.class,
new FrameTabellaFile3(defaultRenderer));
table.setPreferredScrollableViewportSize(new Dimension(400, 200));


table.addMouseListener(new JTableButtonMouseListener( table));

table.setValueAt("pippo",0,0);

scrollPane = new JScrollPane( table);
setContentPane( scrollPane);
}

public static void main(String[] args) {
JFrame frame;
WindowListener exitListener;

exitListener = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Window window = e.getWindow();
window.setVisible(false);
window.dispose();
System.exit(0);
}
};

frame = new JTableButton();
frame.addWindowListener(exitListener);
frame.pack();
frame.setVisible(true);
}
}

LeleFT
25-03-2004, 10:17
Ciao. Innanzitutti, se togli l'asterisco dai tag [*CODE] e [*/CODE] il codice si formatta meglio ;) ;)

Poi, se ho capito bene il tuo problema, dovresti fare in modo che, quando crei il nuovo JFrame, venga passato ad esso (magari tramite costruttore) un riferimento al Frame principale, oppure alla JTable.

In questo modo puoi andare a modificare i valori della JTable dall'interno del nuovo frame.

Ovviamente devo aver previsto dei metodi apposta per la modifica dei valori nella JTable.


Ciao. :ciauz:

pedroriky
25-03-2004, 11:17
Ciao
ho provato con l'istruzione (JTableButton)frm.getOwner()
dove JTableButton la classe che estende JFrame e frm la finestra
che apro quando clicco sulla table ma non riesco a raggiungere la tabella.Come mai?Ho provato anche passandogli un istanza del frame nel costruttore.Stesso risultato!

LeleFT
25-03-2004, 11:27
Allora... tu hai il tuo frame principale, lo chiamo FrmPrincipale, dove viene visualizzata la JTable, poi hai il tuo secondo frame che viene aperto dal pulsante, lo chiamo FrmSecondario.
A questo punto il codice del pulsante qualcosa del genere:


public void actionPerformed(ActionEvent ae) {
FrmSecondario frmSecondario = new FrmSecondario();
}

Tu dovresti far s che il costruttore di FrmSecondario accetti come parametro un oggetto di tipo FrmPrincipale:


class FrmSecondario extends JFrame {
private FrmPrincipale frm1;
public FrmSecondario(FrmPrincipale frm1) {
this.frm1 = frm1;
}
}

Con una struttura cos il codice del pulsante viene modificato in questo modo:


public void actionPerformed(ActionEvent ae) {
FrmSecondario frmSecondario = new FrmSecondario(this);
}

Poi, prevedi dei metodi per modificare la JTable che si trova nel FrmPrincipale:


class FrmPrincipale extends JFrame {
... // tutto quello che c'
public void setTabella( <parametri>) {
... // Qui accedi alla tua tabella e setti quello che vuoi
}
}

E accedi a questo metodo dal Frame secondario:


class FrmSecondario extends JFrame {
...
public void modificaTabellaNelFramePrincipale() {
... // eventuali elaborazioni
frm1.setTabella( <parametri>);
}
}

Questa dovrebbe essere, a grandi linee, la struttura.


Ciao. :ciauz:

Johnny_Depp
25-03-2004, 15:41
p.s. aggiungiamo il linguaggio utilizzato nel titolo.

Loading