Swing GUI: прокрутка не обновляется, когда JTable становится больше - PullRequest
0 голосов
/ 27 февраля 2009

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 27 февраля 2009

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

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 голосов
/ 05 марта 2009

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

...