2009-02-27 2 views
0

У меня есть графический интерфейс Java Swing и возникла проблема с JTable в JScrollPane. По какой-то причине, когда строки таблицы модели увеличиваются во время выполнения программы, JScrollPane не обновляется - то есть, если строки увеличиваются, так что высота таблицы превышает высоту прокрутки, панели прокрутки не обновляются, как предполагалось. (Новые строки отображаются на экране, как ожидалось). Если размер окна изменяется, прокрутка обновляется, как ожидалось.Swing GUI: прокрутка не обновляется, когда JTable становится больше

Вертикальная политика скроллинг VERTICAL_SCROLLBAR_AS_NEEDED, табличные модели fireTableDataChanged называется ..

К сожалению, код немного сложен, так что я не могу предоставить образец кода, вызывающего проблему. Но подумал спросить, если кто-то есть идеи прямой ..

EDIT: Еще немного более запутанным: горизонтальная прокрутка политика HORIZONTAL_SCROLLBAR_AS_NEEDED, и если ширина таблицы, если по ширине зрения (то есть горизонтальная полоса прокрутки используется), эта проблема не возникает ...

EDIT2: Проблема заключается не в том, что таблица должна быть прокручена, а в том, что полоса прокрутки не активирована так, как должна.

ответ

0

Хм .. после возвращения к этому вопросу, я узнал, что наш проблема с настройкой заголовка строки в JScrollPane. (Некоторые предпочтительные значения были установлены с не очень чувствительными значениями и т. Д.).

4

Возможно, вам потребуется опубликовать часть вашего кода. Я просто залетел следующий тест, и он работает как рекламируется, то есть вертикальные полосы прокрутки активируются, когда число строк превышает высоту окна просмотра:

import java.awt.GridLayout; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.table.AbstractTableModel; 

public class JTableTest { 

    public static void main(String[] args) { 
     final MyTableModel tm = new MyTableModel(); 
     tm.addData(new Data("R1C1", "R1C2")); 

     JTable table = new JTable(tm); 
     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout()); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setSize(400, 150); 
     frame.setVisible(true); 

     Thread t = new Thread(new Runnable() { 
      private int count = 2; 
      public void run() { 
       for (; ;) { 
        tm.addData(new Data("R" + count + "C1", "R" + count + "C2")); 
        count++; 
        try { 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     t.start(); 
    } 

    private static class MyTableModel extends AbstractTableModel { 
     private List<Data> dataList = new ArrayList<Data>(); 

     public int getColumnCount() { 
      return 2; 
     } 

     public void addData(Data data) { 
      dataList.add(data); 
      fireTableRowsInserted(dataList.size()-1, dataList.size()-1); 
     } 

     public int getRowCount() { 
      return dataList.size(); 
     } 

     public Object getValueAt(int rowIndex, int columnIndex) { 
      Data data = dataList.get(rowIndex); 
      return columnIndex == 0 ? data.data1 : data.data2; 
     } 
    } 

    private static class Data { 
     public String data1; 
     public String data2; 

     public Data(String data1, String data2) { 
      this.data1 = data1; 
      this.data2 = data2; 
     } 
    } 
} 
+0

Thanks; последний '}' был забыт вне раздела кода. Но да, я подумаю, что мне нужно разработать тестовую версию, у которой есть проблема (или выяснить, как исправить ошибку) – Touko

Смежные вопросы