Почему-то в JTable не появляется горизонтальная полоса прокрутки

Взгляните на следующий фрагмент кода,

public class FrameFoo extends JFrame {
    private TableAdapter mAdapter;

    public FrameFoo() {
        HashMap<Integer, String> m = new HashMap<Integer, String>();

        m.put(1, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(2, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(3, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(4, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(5, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(6, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
        m.put(7, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");

        mAdapter = new TableAdapter(m);

        initComponents();
    }

    private void initComponents() {

        mScrollPane = JScrollPane();
        mTable = new JTable();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new java.awt.Dimension(400, 200));
        setResizable(false);

        mTable.setModel(mAdapter);
        mTable.setRowHeight(35);
        mScrollPane.setViewportView(mTable);

        getContentPane().add(mScrollPane, BorderLayout.CENTER);

        pack();
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                 if ("Nimbus".equals(info.getName())) {
                     UIManager.setLookAndFeel(info.getClassName());
                     break;
                 }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } 

        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new FrameFoo().setVisible(true);
            }
        });
    }

    private JScrollPane mScrollPane;
    private JTable mTable;
}

и это;

public class TableAdapter extends AbstractTableModel {

    private Map<Integer, String> m;

    /*
     * Assume no changes (add/remove) to m will be made after initialization.
     */
    public TableAdapter(Map<Integer, String> m) {
        this.m = m;
    }

    public void notifyDataSetChanged() {
        fireTableDataChanged();
    }

    @Override
    public int getRowCount() {
        return m.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public String getValueAt(int rowIndex, int columnIndex) {

        if (columnIndex < 0 || columnIndex > 1) {
            throw new IllegalArgumentException();
        }

        return columnIndex == 0 ? rowIndex + 1 + "" : m.get(rowIndex + 1);
    }
}

Теперь, когда я добавляю данные в таблицу, при необходимости отображается вертикальная полоса прокрутки, но горизонтальная полоса не отображается, вместо этого выполняется обрезка строк в последнем столбце. Я не понимаю, что здесь не так ...

и вот как это выглядит,

введите описание изображения здесь


person Rupesh    schedule 02.06.2014    source источник
comment
возможно, необходимо переопределить политику JScrollBars, возможно, что-то заблокировать (например, PreferredSize и используемый LayoutManager), чтобы лучше помочь быстрее опубликовать SSCCE / MCVE, короткий, запускаемый, компилируемый с жестко заданным значением для JTable / XxxTableModel   -  person mKorbel    schedule 02.06.2014
comment
Не setPreferredSize; переопределить getPreferredScrollableViewportSize.   -  person trashgod    schedule 02.06.2014
comment
Да, я думаю, этот дубликат - вот ответ!   -  person Dan Temple    schedule 02.06.2014
comment
решение вопроса в первом комментарии @CanadianDavid не работает для меня ..   -  person Rupesh    schedule 02.06.2014
comment
Переопределить getPreferredSize() метод JTable. переопределить getPreferredSize() вместо setPreferredSize() метода.   -  person Braj    schedule 02.06.2014
comment
Чтобы быстрее получить более качественную помощь, опубликуйте MCVE (минимальный полный и проверяемый пример).   -  person Andrew Thompson    schedule 02.06.2014
comment
@AndrewThompson Я обновил описание вопроса, а также предоставил полный src для воспроизведения проблемы, пожалуйста, посмотрите.   -  person Rupesh    schedule 02.06.2014


Ответы (1)


Добавьте приведенный ниже код после mTable.setRowHeight(35); в вашем FrameFoo классе

mTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        final TableColumnModel columnModel = mTable.getColumnModel();
        for (int column = 0; column < mTable.getColumnCount(); column++) {
            int width = 50; // Min width
            for (int row = 0; row < mTable.getRowCount(); row++) {
                TableCellRenderer renderer = mTable.getCellRenderer(row, column);
                Component comp = mTable.prepareRenderer(renderer, row, column);
                width = Math.max(comp.getPreferredSize().width, width);
            }
            columnModel.getColumn(column).setPreferredWidth(width);
        }
person Arijit    schedule 02.06.2014
comment
это работает .. спасибо. не могли бы вы дать мне несколько ссылок о том, что здесь происходит? - person Rupesh; 02.06.2014
comment
@Rupesh: код изменяет размер столбцов в зависимости от размера самого большого элемента данных в столбце. - person Gilbert Le Blanc; 02.06.2014
comment
@Rupesh, could you please give me some links - Может быть, поможет Настройщик столбцов таблицы . - person camickr; 02.06.2014