Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [JAVA] Update jtable

  1. #1

    Update jtable

    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.
    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(tableListener.getSelectedRow(),0).toString());
       txtCol1.setText(tableListener.getValueAt(tableListener.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(tableListener.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);
      }
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,301
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    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!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,301
    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:
    codice:
    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:
    codice:
    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:
    codice:
    public void actionPerformed(ActionEvent ae) {
       FrmSecondario frmSecondario = new FrmSecondario(this);
    }
    Poi, prevedi dei metodi per modificare la JTable che si trova nel FrmPrincipale:
    codice:
    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:
    codice:
    class FrmSecondario extends JFrame {
       ...
       public void modificaTabellaNelFramePrincipale() {
          ... // eventuali elaborazioni
          frm1.setTabella( <parametri>);
       }
    }
    Questa dovrebbe essere, a grandi linee, la struttura.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    p.s. aggiungiamo il linguaggio utilizzato nel titolo.
    ...Terrible warlords, good warlords, and an english song

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.