Всем привет! Есть JTable в JScrollPane. Добавляю в конец таблицы строку. Надо чтоб таблица в скролле сдвинулась так, чтоб стала видна эта новая строка. Удалось этого добиться только повтором команды setViewPosition. После первой команды позиция устанавливается не та что указывается!  На 1 строку меньше чем надо происходит сдвиг. Точно тоже самое при использовании getViewport().scrollRectToVisible. В чём прикол? Или прокол В меню жмите "Выполнить-добавить" В коде закоментирована повторная команда Код | import javax.swing.table.*; import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class ShowTable { public static void main(String[] args) { JFrame frame = new ShowTableFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.setVisible( true ); } }
class ShowTableFrame extends JFrame { public ShowTableFrame() { setSize( 200, 300 ); setTitle("ShowTable"); Container contentPane = getContentPane(); myDataModel.getDataFromSource( 999, 2 ); table = new JTable( myDataModel ); scrollPane = new JScrollPane( table );
contentPane.add( scrollPane );
addMenu(); }
private void addMenu() { JMenuBar menuBar = new JMenuBar(); setJMenuBar( menuBar );
JMenu actionMenu = new JMenu("Выполнить"); menuBar.add( actionMenu );
JMenuItem addRowItem = new JMenuItem("Добавить"); actionMenu.add( addRowItem );
addRowItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { myDataModel.addRow(); table.setRowSelectionInterval( table.getRowCount() - 1, table.getRowCount() - 1 ); myDataModel.fireTableRowsInserted( table.getRowCount() - 1, table.getRowCount() - 1);
JViewport tblView = scrollPane.getViewport(); Point p = new Point( 0, (int)( table.getRowHeight() * table.getRowCount() - tblView.getExtentSize().getHeight() ) );
System.out.println( "setViewPosition:" + p ); tblView.setViewPosition( p ); System.out.println( "ViewPosition:" + tblView.getViewPosition() );
// тут раскомментировать чтоб стало хорошо :) // tblView.setViewPosition( p ); // System.out.println( "ViewPosition 2:" + tblView.getViewPosition() );
/* это др.вариант с тем же эффектом Rectangle tableRect = table.getCellRect( table.getRowCount(), table.getColumnCount(), true ); System.out.println( "tableRect:" + tableRect );
scrollPane.getViewport().scrollRectToVisible( tableRect ); scrollPane.getViewport().scrollRectToVisible( tableRect ); */ } } );
JMenuItem testItem = new JMenuItem("Test"); actionMenu.add( testItem ); testItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("table.getRowCount():" + table.getRowCount()); System.out.println("ViewPosition:" + scrollPane.getViewport().getViewPosition() ); // System.out.println("ExtentSize:" + scrollPane.getViewport().getExtentSize() ); } } );
}
private ShowTableDataModel myDataModel = new ShowTableDataModel(); private JTable table; private JScrollPane scrollPane; }
class ShowTableDataModel extends AbstractTableModel { public void addRow() { this.numRows++; }
public void getDataFromSource( int numRows, int numCols ) { this.numRows = numRows; this.numCols = numCols; }
public Object getValueAt( int r, int c ) { return ( r + 1 ) * ( c + 1 ); }
public int getRowCount() { return numRows; }
public int getColumnCount() { return numCols; }
public String getColumnName( int c ) { return "Column_" + c; }
private int numRows, numCols; }
java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode)
|
|