Omar66
Зарегистрирован: 23.04.2008 Сообщения: 1
|
Добавлено: Ср Апр 23 2008 05:10 Заголовок сообщения: java. JTable в JScrollPane |
|
|
Всем привет!
Есть JTable в JScrollPane. Добавляю в конец таблицы строку. Надо чтоб таблица в скролле сдвинулась так, чтоб стала видна эта новая строка. Удалось этого добиться только повтором команды setViewPosition. После первой команды позиция устанавливается не та что указывается! На 1 строку меньше чем надо происходит сдвиг. Точно тоже самое при использовании getViewport().scrollRectToVisible.
В чём прикол?
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)
В меню жмите "Выполнить-добавить"
Код: |
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;
}
|
|
|