Como posicionar o jscrollbar na linha que está sendo editada da JTable?

0 respostas
Roger75

Olá pessoal,

Tenho um frame no qual existem um botão e um jtable. Quando clico no botão uma célula da linha da jtable é editada, mas a scrollbar vertical não acompanha, e a linha fica escondida pra baixo.
Ao clicar no botão queria que a scrollbar posicionasse na linha editada também.
Alguém saberia por quê está acontecendo isso?

Código abaixo:

package scroll;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;




public class TesteJComboJTable extends JFrame{
    public TesteJComboJTable(){
    	JPanel pane=new JPanel();
        //Container pane = getContentPane();
		pane.setLayout(new BorderLayout());
        JTable table = new JTable();
        JButton bSelectRow=new JButton("ir p/ row");
        JPanel panelButton=new JPanel();
        panelButton.add(bSelectRow);
        
	    DefaultTableModel model = (DefaultTableModel)table.getModel();
	    
	    // Add some columns
	    //model.addColumn("A", new Object[]{"item1"});
	    //model.addColumn("B", new Object[]{"item2"});
	    
	    model.addColumn("A", new Object[]{"item1","item3"});
	    model.addColumn("B", new Object[]{"item2","item4"});
	    model.addColumn("C", new Object[]{"item2","item4"});
	    
	    // These are the combobox values
	    String[] values = new String[]{"item1", "item2", "item3"};
	    String[] values2 = new String[]{"item11", "item22", "item33"};
	    // Set the combobox editor on the 1st visible column
	    int vColIndex = 0;
	    TableColumn col = table.getColumnModel().getColumn(vColIndex);
	    col.setCellEditor(new MyComboBoxEditor(values));
	    
	    // If the cell should appear like a combobox in its
	    // non-editing state, also set the combobox renderer
	    col.setCellRenderer(new MyComboBoxRenderer(values));
	    
	    vColIndex = 2;
	    TableColumn col2 = table.getColumnModel().getColumn(vColIndex);
	    col2.setCellEditor(new MyComboBoxEditor(values2));
	    
	    // If the cell should appear like a combobox in its
	    // non-editing state, also set the combobox renderer
	    col2.setCellRenderer(new MyComboBoxRenderer(values2));
	    
		final JTable jtable1=table;
		final DefaultTableModel modelo1=model;
		table.addKeyListener(new KeyAdapter() {
				public void keyPressed(KeyEvent e) {
					//int linha = jtable.getSelectedRow() ;
					int linha = jtable1.getSelectedRow() ;
					//if (e.getKeyCode() == KeyEvent.VK_ENTER){
					int tot_linhas, tot_colunas;
					tot_linhas=jtable1.getRowCount();
					tot_colunas=jtable1.getColumnCount();
					int coluna=jtable1.getSelectedColumn();
					System.out.println("Nro de colunas:"+jtable1.getColumnCount());
					System.out.println("Coluna selecionada:"+jtable1.getSelectedColumn());
					
					//if (e.getKeyCode() == KeyEvent.VK_TAB && jtable1.getSelectedColumn()==(jtable1.getColumnCount()-1)){
					if (e.getKeyCode() == KeyEvent.VK_TAB && (tot_linhas-1==linha) && (tot_colunas-1==coluna)){
						modelo1.addRow(new String[]{"",""});

						jtable1.changeSelection(linha++,0,true,true );
						//contlinhas++;
						//numlinhas++;	 										
					}
				}
		});		
	    
		for (int p=1;p<30;p++){
			modelo1.addRow(new String[]{"",""});
		}
		//table.editCellAt(table.getRowCount()-1,table.getColumnCount()-1);
		System.out.println("table.getRowCount()="+table.getRowCount());
		table.setRowSelectionInterval(table.getRowCount()-1,table.getRowCount()-1);
		table.editCellAt(table.getRowCount()-1,1);
	    JScrollPane jsp = new JScrollPane(table);
	    jsp.scrollRectToVisible(jsp.getBounds());
	    JScrollBar jsb=jsp.getVerticalScrollBar();
	    System.out.println("jsb.getMaximum()="+jsb.getMaximum());
	    //jsb.setValue(jsb.getMaximum());
	    jsb.setValue(jsb.getMinimum());
	    //jsb.setValue(500);
	    jsb.addAdjustmentListener(new AdjListener());

	    //jsb.
	    bSelectRow.addMouseListener(new ButtListener(table,jsb));
		pane.add(jsp, BorderLayout.CENTER);
		pane.add(panelButton, BorderLayout.NORTH);
		Dimension d = pane.getPreferredSize();
		pane.add(jsp);
		pane.scrollRectToVisible( new Rectangle(0, d.height, 1, 1) );
		//getContentPane().add(jsp);
		getContentPane().add(pane);

    }
    class ButtListener implements MouseListener{
    	private JTable jtable;
    	private JScrollBar jsb;
		public ButtListener(JTable jtable){
    		this.jtable=jtable;
    	}
		public ButtListener(JTable jtable, JScrollBar jsb){
			this.jtable=jtable;
			this.jsb=jsb;
			
		}
		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
		 */
		public void mouseClicked(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
		 */
		public void mouseEntered(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
		 */
		public void mouseExited(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
		 */
		public void mousePressed(MouseEvent arg0) {
			System.out.println("Clicou o botao!");
			//jtable.requestFocus();
			//jtable.setRowSelectionInterval(20,22);
			jtable.editCellAt(20,1);
			
			//jsb.setValue(jsb.getMaximum());
			
		}

		/* (non-Javadoc)
		 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
		 */
		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
    	
    }
    class AdjListener implements AdjustmentListener{

		/* (non-Javadoc)
		 * @see java.awt.event.AdjustmentListener#adjustmentValueChanged(java.awt.event.AdjustmentEvent)
		 */
		public void adjustmentValueChanged(AdjustmentEvent arg0) {
			// TODO Auto-generated method stub
			JScrollBar jscollbar=(JScrollBar)arg0.getSource();
			System.out.println("jscrollbar="+jscollbar.getValue());
			
		}
    	
    }
	public static void main(String[] args) {
			    

	    //*****
		TesteJComboJTable stt = new TesteJComboJTable();
		stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		stt.setSize(400, 300);
		stt.setVisible(true);
	    
	    //*****


	}
}
Criado 3 de agosto de 2005
Respostas 0
Participantes 1