Swing GUI: прокрутка не обновляется, когда JTable становится больше

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

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

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

РЕДАКТИРОВАТЬ: Еще немного запутано: политика горизонтальной прокрутки есть HORIZONTAL_SCROLLBAR_AS_NEEDED, и если ширина таблицы превышает ширину представления (то есть используется горизонтальная полоса прокрутки), этой проблемы не возникает ...

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

Ответов (2)

Решение

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

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

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;
        }
    }
}