Azione al click su una cella di una JTable

di il
4 risposte

Azione al click su una cella di una JTable

Ciao
ho una JTable riempita di dati presi dal database, per ora è solo una lista di nomi, perciò ha solo una colonna. Al click del mouse su una determinata cella dovrei far comparire una scheda con le relative informazioni (sempre prese dal database).
Ho provato con un mouse listener, ma escono un sacco di errori, non so bene cosa sbaglio, quindi vorrei un aiuto.
Posto il codice:

Questo è il mouse listener che ho scritto:

class MousePressListener implements MouseListener
        {
        	public void mouseClicked(MouseEvent e) 
        	{
        		int x = e.getX();
        		int y = e.getY();
        		int col = table.convertColumnIndexToModel(x);
        		int row = table.convertRowIndexToModel(y);
			TableModel model = (TableModel)e.getSource();
			String selezione = model.getValueAt(row, col).toString();
			SchedaFrame c = new SchedaFrame(mainFrame);
			c.showData(selezione);
			mainFrame.goSchedaFrame();
			}
			@Override
			public void mouseEntered(MouseEvent e) { 
				// TODO Auto-generated method stub				
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub				
			}
		}


Poi lo implemento nella classe in cui visualizzo la tabella in questo modo:
		
	    MouseListener l = new MousePressListener();
	    table.addMouseListener(l);	    
Sto utilizzando un card layout in un frame principale, che è questo:

public class MainFrame extends JFrame{
	
	private Container contentPane = getContentPane();
	private CardLayout cardLayout = new CardLayout();
	
	public MainFrame()
	{	
		setSize(900,700); 
		setLocation(250, 10); 
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE); 
		
		contentPane.setLayout(cardLayout);
		contentPane.add(new HomeFrame(this), "Home");
		getContentPane().add(new SchedaFrame(this), "scheda");
	}
	
	public void goHomeFrame() 
	{
		this.setTitle("Home");
		cardLayout.show(contentPane, "Home");
	}
	
	public void goSchedaFrame()
	{
		this.setTitle("Scheda");
		cardLayout.show(contentPane, "scheda");
	}
}
Ed infine, non so se possa essere utile ma vi inserisco tutto, la card che dovrei visualizzare al click sulla cella della table:

public class CardFrame extends JPanel
{
	private JScrollPane scroll;
	private JTable scheda;
	
	public void showData(String selected)
	{
		ArrayList<TabellaDB> data = new ArrayList<TabellaDB>();
		data = TabellaDBDAO.showAllData(selected);
		TableModelCard table = new TableModelCard(data);
		scheda = new JTable(table);
	}
	
	public CardFrame(MainFrame mainFrame) throws HeadlessException
	{	 
		scroll = new JScrollPane(scheda);
		add(scroll);
	}
}

4 Risposte

  • Re: Azione al click su una cella di una JTable

    rossociliegia ha scritto:


    
            		int x = e.getX();
            		int y = e.getY();
            		int col = table.convertColumnIndexToModel(x);
            		int row = table.convertRowIndexToModel(y);
    			TableModel model = (TableModel)e.getSource();
    			String selezione = model.getValueAt(row, col).toString();
    
    No, la procedura è:

    1) Dal MouseEvent si ottiene il Point del punto tramite getPoint()
    2) Con il Point si ottengono riga/colonna nella "view" (in JTable) tramite rowAtPoint(Point) e columnAtPoint(Point) di JTable
    3) Poi:
    -- Se si usa il getValueAt/setValueAt di JTable, allora row/column sono già esattamente quelli appena presi (getValueAt/setValueAt di JTable accede al model "traslando" lui al volo gli indici)
    oppure
    -- Se per qualche (altro) motivo servono proprio espressamente gli indici nel model, allora si traslano gli indici con convertRowIndexToModel e convertColumnIndexToModel.
  • Re: Azione al click su una cella di una JTable

    andbin ha scritto:


    -- Se si usa il getValueAt/setValueAt di JTable, allora row/column sono già esattamente quelli appena presi (getValueAt/setValueAt di JTable accede al model "traslando" lui al volo gli indici)
    Grazie!! Ho sistemato le cose ed ora al click del mouse mi apre la card. Avrei un altro problema ora però, se vuoi aiutarmi te ne sarò grata. Quando faccio click sulla cella mi apre la "scheda" che dovrebbe contenere le informazioni, essa ad ora contiene solo uno scroll pane con dentro la tabella con le info. Mi mostra lo scroll pane ma non la tabella
    Saresti così gentile da controllare cosa sbaglio?
    
    public class CardFrame extends JPanel
    {
    	private JScrollPane scroll;
    	private JTable scheda;
    	private TableModelCard table; 
    	ArrayList<TabellaDB> data = new ArrayList<TabellaDB>();
    	
    	public void showData(String selected)
    	{
    		data = TabellaDBDAO.showAllData(selected);
    		table = new TableModelCard(data);
    	}
    	
    	public CardFrame(MainFrame mainFrame) throws HeadlessException
    	{	 
    		scheda = new JTable(table);
    		scroll = new JScrollPane(scheda);
    		add(scroll, BorderLayout.CENTER);
    	}
    }
    
    Forse il table model??
    
    public class TableModelCard extends AbstractTableModel{
    	
    	private static String[] columnNames = { "nome", "descrizione", "immagine", "costo" };
    	private ArrayList<TabellaDB> dataTab;
    	
    	public ArrayList<TabellaDB> getDati()
    	{
    		return dataTab;
    	}
    
    	public TableModelCard(ArrayList<TabellaDB> data) 
    	{
    		super();
    		this.dataTab = data;
    	}
    	
    	public String getColumnName(int column) 
    	{
            return columnNames[column];
        	}
    	
    	public int getRowCount() 
    	{
    		return dataTab.size();
    	}
    		
    	public Object getValueAt(int row, int column)
    	 {
            TabellaDB d = dataTab.get(row);
            switch (column) {
                case 0: return d.getNome();
                case 1: return d.getDescrizione();
                case 2: return d.getPathImg();
                case 3: return d.getCosto();
            }
            return null;
       	 }
    
    	public int getColumnCount() 
    	{
    		return columnNames.length;
    	}
    
    }
    
  • Re: Azione al click su una cella di una JTable

    rossociliegia ha scritto:


    
    public class CardFrame extends JPanel
    {
    	private JScrollPane scroll;
    	private JTable scheda;
    	private TableModelCard table; 
    	ArrayList<TabellaDB> data = new ArrayList<TabellaDB>();
    	
    	public void showData(String selected)
    	{
    		data = TabellaDBDAO.showAllData(selected);
    		table = new TableModelCard(data);
    	}
    	
    	public CardFrame(MainFrame mainFrame) throws HeadlessException
    	{	 
    		scheda = new JTable(table);
    		scroll = new JScrollPane(scheda);
    		add(scroll, BorderLayout.CENTER);
    	}
    }
    
    Scusa ma ... quando viene invocato il costruttore CardFrame, fai new JTable(table) ma questo campo table è ancora a null!!
    Anche se poi successivamente andassi ad invocare showData, che assegna a table, il JTable l'hai già creato prima.
    Come pensi possa funzionare??

    Dovresti avere le idee un po' più chiare su questi aspetti di inizializzazione degli oggetti.
  • Re: Azione al click su una cella di una JTable

    andbin ha scritto:


    Scusa ma ... quando viene invocato il costruttore CardFrame, fai new JTable(table) ma questo campo table è ancora a null!!
    Caspita che scema....hai ragione.
Devi accedere o registrarti per scrivere nel forum
4 risposte