Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Недоскролл JTable в JScrollPane


Автор: Omar66 25.4.2008, 08:15
Всем привет! 
Есть JTable в JScrollPane. Добавляю в конец таблицы строку. Надо чтоб таблица в скролле сдвинулась так, чтоб стала видна эта новая строка. Удалось этого добиться только повтором команды setViewPosition. После первой команды позиция устанавливается не та что указывается! smile  На 1 строку меньше чем надо происходит сдвиг. Точно тоже самое при использовании getViewport().scrollRectToVisible. 

В чём прикол? Или прокол  smile 

В меню жмите "Выполнить-добавить" 
В коде закоментирована повторная команда

Код

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) 



Автор: dorogoyIV 27.4.2008, 09:57
Код

      scrollPane.getViewport().scrollRectToVisible(new Rectangle(tableRect.x, tableRect.y, tableRect.width, tableRect.height + table.getRowHeight())); 

просто Rectangle имеет высоту 0

Автор: Omar66 28.4.2008, 02:39
Помогло smile Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)