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);
//*****
}
}