Как сделать JTable как AutoResize, так и горизонтально прокручиваемым? - PullRequest
25 голосов
/ 24 мая 2011

Я помещаю JTable в JScrollPane

Но если я установлю JTable Auto Resizeable, у него не будет горизонтальной полосы прокрутки.

если я установлю AUTO_RESIZE_OFF, то Jtable не будет заполнять ширину своего контейнера, если ширина столбца недостаточно велика.

Так, как я могу сделать это:

  1. когда таблица недостаточно широка, разверните, чтобы заполнить ее ширину контейнера
  2. когда таблица достаточно широка, сделайте ее прокручиваемой.

Спасибо

Ответы [ 4 ]

37 голосов
/ 24 мая 2011

Вам необходимо настроить поведение интерфейса Scrollable.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableHorizontal extends JFrame
{
    public TableHorizontal()
    {
        final JTable table = new JTable(10, 5)
        {
            public boolean getScrollableTracksViewportWidth()
            {
                return getPreferredSize().width < getParent().getWidth();
            }
        };
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        final JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableHorizontal frame = new TableHorizontal();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}

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

9 голосов
/ 28 июня 2012

Если по какой-то причине настройка JTable не является опцией (например, она может быть создана в стороннем коде), вы можете достичь того же результата, установив его для переключения между двумя различными режимами JTable AUTO_RESIZE при каждом изменении размера окна просмотра, например:

jTable.getParent().addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(final ComponentEvent e) {
        if (jTable.getPreferredSize().width < jTable.getParent().getWidth()) {
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        } else {
            jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        }
    }
});
2 голосов
/ 20 сентября 2013

Я обнаружил, что все, что нужно, - это включить

  table = new JTable(model);
  // this enables horizontal scroll bar
  table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );    

, а затем, когда требуемая ширина и высота области просмотра, будет подсчитано:

  frame.getContentPane().add(new JScrollPane(table))
  table.setPreferredScrollableViewportSize(new Dimension(width,height));
0 голосов
/ 24 мая 2011

Если вы установите для Layout его контейнера значение BorderLayout с ограничением макета BorderLayout.CENTER , JTable автоматически изменит размер, чтобы соответствовать его контейнеру.

Если вы хотите сделать компонент прокручиваемым, вы можете обернуть JTable с помощью JScrollPane .

setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...