Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Implementare doppio click su jtable errore aiuto per favore

    Salve ragazzi, ho un enorme problema.

    Ho un Jframe che contiene un una tabella voglio implementare un metodo in maniera tale che quando faccio doppio clik su una riga della tabella deve essere eseguita una funziona che prende informazioni da delle text contenuto nel frame.

    Questo tipo di funzione l'ho già implementata altre volte ma adesso mi compare un errore strano che credo sia dovuto alla classe gridbaglayoutdemo.java che ho copiato dal sito di java.sun.

    l'errore è il seguente

    Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
    No enclosing instance of type GridBagLayoutDemo is accessible. Must qualify the allocation with an enclosing instance of type GridBagLayoutDemo (e.g. x.new A() where x is an instance of GridBagLayoutDemo).

    mi sapete dire cosa posso fare?????

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Implementare doppio click su jtable errore aiuto per favore

    Originariamente inviato da bircastri
    Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
    No enclosing instance of type GridBagLayoutDemo is accessible. Must qualify the allocation with an enclosing instance of type GridBagLayoutDemo (e.g. x.new A() where x is an instance of GridBagLayoutDemo).

    mi sapete dire cosa posso fare?????
    Se posti il codice vediamo .... altrimenti è "criptico" pure per me ....
    Deduco comunque che non centra nulla con JTable, probabilmente ci sono questioni con i tipi "innestati".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ecco di seguito il codice

    codice:
    public class GridBagLayoutDemo {
    static Database db;
    	static JTable table;
        final static boolean shouldFill = true;
        final static boolean shouldWeightX = true;
        final static boolean RIGHT_TO_LEFT = false;
    	private static final int AUTO_RESIZE_OFF = 0;
        JTextArea output;
        JScrollPane scrollPane;
        static JFrame frame;
        public static Component addComponentsToPane(Container pane) {
            if (RIGHT_TO_LEFT) {
                pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            }
            JScrollPane jScrollPane1,jScrollPane2;
            
            JLabel labelSpazio;
            JLabel labelCodiceLocalita;
            final JTextField textCodiceLocalita ;
            JLabel labelOraPartenze;
            final JTextField textOraPartenze;
            JLabel labelCodice1Nota;
            final JTextField textCodice1Nota;
            JLabel labelCodice2Nota;
            final JTextField textCodice2Nota;
            JLabel labelOraArrivoDa;
            final JTextField textOraArrivoDa;
            JLabel labelOraPartenzaPer;
            final JTextField textOraPartenzaPer;
            JLabel labelCodice1NotaBis;
            final JTextField textCodice1NotaBis;
            JLabel labelCodice2NotaBis;
            final JTextField textCodice2NotaBis;
            JLabel labelOraArrivoPer;
            final JTextField textOraArrivoPer;
            JButton buttonInserisci;
            
    	pane.setLayout(new GridBagLayout());
    	GridBagConstraints c = new GridBagConstraints();
    	if (shouldFill) {
    	//natural height, maximum width
    	c.fill = GridBagConstraints.HORIZONTAL;
    	}
    	
    	inizializzaDatabase();
    	
    	Font myFont = new Font("Verdana", Font.PLAIN, 15);
        
    	//devo aggiungere una tabella
    	Vector v = db.eseguiQuery( "SELECT * FROM archiviopartenzeferiali  ;" );
    	Vector vettore = new Vector();
        
        vettore.add(new String("CODICE LOCALITA"));
        vettore.add(new String("ORA PARTENZA"));
        vettore.add(new String("NOTA"));
        vettore.add(new String("NOTA BIS"));
        vettore.add(new String("ORA ARRIVO"));
        vettore.add(new String("ORA PARTENZA PER"));
        vettore.add(new String("NOTA"));
        vettore.add(new String("NOTA BIS"));
        vettore.add(new String("ORA DI ARRIVO PER"));
        
       
        
    
        table = new TableExample(v, vettore);
    
    
    //////codice..............
    
    
    questo è il codice di tableexample che è copiato sempre in questa classe
    
    class TableExample extends JTable {
      	
      	
              private class MyMouseAdapter extends MouseAdapter {
              	
                  public void mouseClicked(MouseEvent me) {
                	  
                  	TableExample t = (TableExample)me.getSource();
                      if (me.getClickCount() == 2) {
      // facciamo qualcosa... tu potresti ricavare il dato selezionato,
      // e lanciare una nuova query.
                          int row = t.rowAtPoint(me.getPoint());
                          int column = t.columnAtPoint(me.getPoint());
                         Object prova= t.getValueAt(row, column);
                         elementiRicetta = db.eseguiQuery( "SELECT * FROM Ingredienti WHERE Descrizione = '"+prova+"' ;" );
                         System.out.println(prova);
                         addRow();
                         selectCell(i,0);
                         ricetteTabella.setValueAt(prova,i,0);
                         i++;
                         
                      }
                  }
    
    			
              }
    
      // serve solo ad inibire la funzione "principe" del doppio click su una JTable, ovver
      // editare la cella target del doppio click.
              public boolean isCellEditable(int row, int column) {
                  return false;
              }
    
              public TableExample(Vector v, Vector n) {
                  super(v, n);            
                  this.addMouseListener(new MyMouseAdapter());
              }
              
              public void selectCell(int row,int col)
              {
                   if(row!=-1 && col !=-1)            
                    {
                    table.setRowSelectionInterval(row,row);
                    table.setColumnSelectionInterval(col,col);
                    }
              }
              
              public void addRow() //Add Row
              {
              Vector r=new Vector();
              r=createBlankElement();
              rows.addElement(r);
              ricetteTabella.addNotify();
    
              }
              public Vector createBlankElement() 
              {
              Vector t = new Vector();
              t.addElement((String) " ");
              t.addElement((String) " ");
              t.addElement((String) " ");
              t.addElement((String) " ");
              t.addElement((String) " ");
              t.addElement((String) " ");
              t.addElement((String) " ");
              return t;
              }
              
          }

  4. #4
    ragazzi, nessuno mi può aiutare???

  5. #5
    Ma ti da errore in compilazione o a runtime?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    no da errore in compilazione

    però facendo questa prova non da errore e cioè:

    invece di scrivere la classe TableExample all'interno della classe GridBagLayoutDemo la scrivo in un altro file quindi come classe esterna funziona perfettamente cioè facendo doppio click su una cella mi stampa a video le coordinate della cella (questo l'ho fatto giusto per vedere se faceva qualcosa)

    ora però non posso utilizzarla in questo modo poichè la funzione che viene attivata quando faccio doppio click deve andare ad operare su delle text che sono presenti nella classe GridBagLayoutDemo cioè per intenderci io facendo doppio click su una cella deve apparire il suo contenuto all'interno di una textBox.

    mi potete aiutare per favroe??

  7. #7
    Però a questo punto il titolo del post è fourviante. Cosa c'entra il doppio click sulla tabella con l'errore di compilazione? Magari specificarlo prima farebbe risparmiare tempo a chi vorrebbe darti una mano. E poi come pretendi che quancuno possa individuare la causa di un errore di compilazione col codice che hai postato, al quale mancano varie parti e non si capisce dove sono le classi (inner, esterne, ecc.)
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    il codice che io ho postato è completo nel senso che tutto quello che io ho inserito è quello che serve cmq visto che me lo hai fatto notare, inserisco l'intera classe così come sta scritta.

    codice:
    
    public class GridBagLayoutDemo {
    static Database db;
    	static JTable table;
        final static boolean shouldFill = true;
        final static boolean shouldWeightX = true;
        final static boolean RIGHT_TO_LEFT = false;
    	private static final int AUTO_RESIZE_OFF = 0;
        JTextArea output;
        JScrollPane scrollPane;
        static JFrame frame;
        public static Component addComponentsToPane(Container pane) {
            if (RIGHT_TO_LEFT) {
                pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            }
            JScrollPane jScrollPane1,jScrollPane2;
            
            JLabel labelSpazio;
            JLabel labelCodiceLocalita;
            final JTextField textCodiceLocalita ;
            JLabel labelOraPartenze;
            final JTextField textOraPartenze;
            JLabel labelCodice1Nota;
            final JTextField textCodice1Nota;
            JLabel labelCodice2Nota;
            final JTextField textCodice2Nota;
            JLabel labelOraArrivoDa;
            final JTextField textOraArrivoDa;
            JLabel labelOraPartenzaPer;
            final JTextField textOraPartenzaPer;
            JLabel labelCodice1NotaBis;
            final JTextField textCodice1NotaBis;
            JLabel labelCodice2NotaBis;
            final JTextField textCodice2NotaBis;
            JLabel labelOraArrivoPer;
            final JTextField textOraArrivoPer;
            JButton buttonInserisci;
            
    	pane.setLayout(new GridBagLayout());
    	GridBagConstraints c = new GridBagConstraints();
    	if (shouldFill) {
    	c.fill = GridBagConstraints.HORIZONTAL;
    	}	
    	inizializzaDatabase();	
    	Font myFont = new Font("Verdana", Font.PLAIN, 15);
    
    	Vector v = db.eseguiQuery( "SELECT * FROM archiviopartenzeferiali  ;" );
    	Vector vettore = new Vector();
        
        vettore.add(new String("CODICE LOCALITA"));
        vettore.add(new String("ORA PARTENZA"));
        vettore.add(new String("NOTA"));
        vettore.add(new String("NOTA BIS"));
        vettore.add(new String("ORA ARRIVO"));
        vettore.add(new String("ORA PARTENZA PER"));
        vettore.add(new String("NOTA"));
        vettore.add(new String("NOTA BIS"));
        vettore.add(new String("ORA DI ARRIVO PER"));
        table = new TableExample(v, vettore);
    
        System.out.println("Sono qui");
        jScrollPane1 = new javax.swing.JScrollPane();
        System.out.println("Sono qui");
        jScrollPane1.setName("jScrollPane1");
        System.out.println("Sono qui");
        table.getColumnModel().getColumn(0).setPreferredWidth(100);
        table.getColumnModel().getColumn(1).setPreferredWidth(180);
        table.getColumnModel().getColumn(2).setPreferredWidth(50);
        table.getColumnModel().getColumn(3).setPreferredWidth(50);
        table.getColumnModel().getColumn(4).setPreferredWidth(180);
        table.getColumnModel().getColumn(5).setPreferredWidth(180);
        table.getColumnModel().getColumn(6).setPreferredWidth(50);
        table.getColumnModel().getColumn(7).setPreferredWidth(50);
        table.getColumnModel().getColumn(8).setPreferredWidth(180);
    
        DefaultTableCellRenderer renderer_archivi = new DefaultTableCellRenderer();
    	renderer_archivi.setHorizontalAlignment(SwingConstants.CENTER);
    	table.getColumnModel().getColumn(1).setCellRenderer(renderer_archivi);
    	table.getColumnModel().getColumn(4).setCellRenderer(renderer_archivi);
    	table.getColumnModel().getColumn(5).setCellRenderer(renderer_archivi);
    	table.getColumnModel().getColumn(8).setCellRenderer(renderer_archivi);
        
    
        jScrollPane1.getViewport().add(table);
        jScrollPane1.setVisible(true);
    
    	c.ipady=82;
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.gridx = 0;
    	c.gridy = 0;
    	pane.add(jScrollPane1, c);
    
    	labelCodiceLocalita = new JLabel("Codice Località: ");
    	if (shouldWeightX) {
    	c.weightx = 0.5;
    	}
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady=10;
    	c.gridx = 0;
    	c.gridy = 1;
    	labelCodiceLocalita.setFont(myFont);
    	pane.add(labelCodiceLocalita, c);
    	
    	   final JComboBox comboBox = new JComboBox();
    	   comboBox.addItem("Snowboarding");
    	   comboBox.addItem("Rowing");
    	   comboBox.addItem("Knitting");
    	   comboBox.addItem("Speed reading");
    	   comboBox.addItem("Pool");
    	   comboBox.addItem("None of the above");
    	   c.weightx = 0.5;
    		Object[] localita = db.eseguiQuery("SELECT LOCALITA FROM archiviolocalita;").toArray();
    		for(int i=0; i<localita.length; i++){
    		   String temp = localita[i].toString();
    		   temp = elimina_caratteri(temp);
    		   localita[i] = temp;
    		  	}
    	
    		comboBox.setModel(new javax.swing.DefaultComboBoxModel(localita));
    	if (shouldWeightX) {
    	c.weightx = 0.5;
    	}
    	c.ipady=1;
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.gridx = 0;
    	c.gridy = 2;
    	pane.add(comboBox, c);
    
    	labelOraPartenze = new JLabel("Ora Partenza: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;     
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    
    	c.gridx = 0;
    	c.gridy = 3;
    	labelOraPartenze.setFont(myFont);
    	pane.add(labelOraPartenze, c);
    	
    	textOraPartenze = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;     
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 4;
    	pane.add(textOraPartenze, c);
    	
    	labelCodice1Nota = new JLabel("Codice 1 nota");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 5;
    	labelCodice1Nota.setFont(myFont);
    	pane.add(labelCodice1Nota, c);
    
    	textCodice1Nota = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 6;
    	pane.add(textCodice1Nota, c);
    
    	labelCodice2Nota = new JLabel("Codice 2 Nota: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;     
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 7;
    	labelCodice2Nota.setFont(myFont);
    	pane.add(labelCodice2Nota, c);
    
    	textCodice2Nota = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;      
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 8;
    	pane.add(textCodice2Nota, c);
    	
    	labelOraArrivoDa = new JLabel("Ora arrivo da: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;   
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 9;
    	labelOraArrivoDa.setFont(myFont);
    	pane.add(labelOraArrivoDa, c);
    
    	textOraArrivoDa = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;      
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 10;
    	pane.add(textOraArrivoDa, c);
    	
    	labelOraPartenzaPer = new JLabel("Ora partenza per: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 11;
    	labelOraPartenzaPer.setFont(myFont);
    	pane.add(labelOraPartenzaPer, c);
    
    	textOraPartenzaPer = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 12;
    	pane.add(textOraPartenzaPer, c);
    	
    	labelCodice1NotaBis = new JLabel("Codice 1° nota bis: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 13;
    	labelCodice1NotaBis.setFont(myFont);
    	pane.add(labelCodice1NotaBis, c);
    
    	textCodice1NotaBis = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 14;
    	pane.add(textCodice1NotaBis, c);
    	
    	labelCodice2NotaBis = new JLabel("Codice 2° nota bis: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 15;
    	labelCodice2NotaBis.setFont(myFont);
    	pane.add(labelCodice2NotaBis, c);
    
    	textCodice2NotaBis = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 16;
    	pane.add(textCodice2NotaBis, c);
    	
    	labelOraArrivoPer = new JLabel("Ora Arrivo per: ");
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 20;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 17;
    	labelOraArrivoPer.setFont(myFont);
    	pane.add(labelOraArrivoPer, c);
    
    	textOraArrivoPer = new JTextField();
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 1;     
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 18;
    	pane.add(textOraArrivoPer, c);
    
    	labelSpazio = new JLabel("");
    	
    	c.fill = GridBagConstraints.HORIZONTAL;
    	c.ipady = 10;      //make this component tall
    	c.weightx = 0.0;
    	c.gridwidth = 3;
    
    	c.gridx = 0;
    	c.gridy = 19;
    	pane.add(labelSpazio, c);
    	
    	buttonInserisci = new JButton();
    	buttonInserisci.setText("Salva");
    	c.fill = GridBagConstraints.VERTICAL;
    	c.ipady = 10;      //make this component tall
    	c.weightx = 0.0;
    	c.gridheight = 10;
    	c.gridwidth = 3;
    	c.gridx = 0;
    	c.gridy = 20;
    	pane.add(buttonInserisci, c);
    	
    	buttonInserisci.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent e ) {
    
            	String localita = comboBox.getSelectedItem().toString();
                String codice =db.eseguiQuery("SELECT CODICE FROM archiviolocalita WHERE localita = '"+localita+"' ;").toString();
                codice = elimina_caratteri(codice);
                int codice2 = Integer.parseInt(codice);
              
    
                String oraPartenza = textOraPartenze.getText();
                int codice1Nota = Integer.parseInt(textCodice1Nota.getText());
                int codice2Nota = Integer.parseInt(textCodice2Nota.getText());
                String oraArrivoDa = textOraArrivoDa.getText();
                String oraPartenzaPer = textOraPartenzaPer.getText();
                int codice1NotaBis = Integer.parseInt(textCodice1NotaBis.getText());
                int codice2NotaBis = Integer.parseInt(textCodice2NotaBis.getText());
                String oraArrivoPer = textOraArrivoPer.getText();       
                 db.eseguiAggiornamento("INSERT INTO archiviopartenzeferiali VALUES ('"+codice2+"', '"+oraPartenza+"', '"+codice1Nota+"', '"+codice2Nota+"', '"+oraArrivoDa+"', '"+oraPartenzaPer+"', '"+codice1NotaBis+"', '"+codice2NotaBis+"', '"+oraArrivoPer+"') ;");
               
            }
    
    		
    		
        });
    	JTextField textOraArrivoper2 = new JTextField();
    	textOraArrivoper2.setVisible(false);
    	return textOraArrivoper2;	 
        }
    
        private static String elimina_caratteri(String numeroPartenzeFeriali) {
    		
    	   numeroPartenzeFeriali = numeroPartenzeFeriali.replace("]", ""); 
    	   numeroPartenzeFeriali = numeroPartenzeFeriali.replace("[", "");
    		return numeroPartenzeFeriali;
    	}
    	private static void inizializzaDatabase() {
    		
    		// TODO Auto-generated method stub
    		db = new Database("partenzearrivi");
    	    if ( !db.connetti() ) {
    	       System.out.println("Errore durante la connessione al database :(");
    	       System.out.println( db.getErrore() );
    	       System.exit(0);
    	    }
    	    else{
    	    	System.out.println("Mi sono connesso");
    	    }
    	}//fine inizializzaDatabase
    
        static void createAndShowGUI() {
    
            frame = new JFrame("GridBagLayoutDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            //Set up the content pane.
            addComponentsToPane(frame.getContentPane());
    
    
            frame.pack();
            frame.setVisible(true);
        }
        
    
        public Container createContentPane() {
       
            JPanel contentPane = new JPanel(new BorderLayout());
            contentPane.setOpaque(true);
    
    
            output = new JTextArea(5, 30);
            output.setEditable(false);
            scrollPane = new JScrollPane(output);
            addComponentsToPane(frame.getContentPane());
            
            return contentPane;
        }
        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();
                }
            });
        }
    
    }
    volevo solo evitare di fare perdere tempo a chi mi vuole aiutare di perdersi tra il codice

  9. #9
    Ma la classe TableExample è esattamente quella che hai postato tu?

    P.S.
    Tempo ne fai perdere se posti solo spezzoni di codice e magari ininfluenti ai fini della correzione e se la descrizione del problema non è accurata.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    allora la classe tableExample è proprio quella, se la taglio da li e creo una nuova classe chiamata TableExample e ci incollo quel codice, non da più errore in compilazione e mi funziona tutto bene.

    Ripeto purtroppo la funzione che devo fare io è questa devo poter facendo doppio clicl su una cella inserire il valore dell'intera riga nelle text. Se utilizzo TableExample come classe esterna questo non si può fare in quanto le varie text sono dichiarate nella classe GridBagLayoutDemo.

    PS la prossima volta per il codice posterò tutto e non solo spezzono. pardon

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 © 2025 vBulletin Solutions, Inc. All rights reserved.