Как сделать JTable и AutoResize и горизонтально прокручиваемым?
Я помещаю JTable в JScrollPane
Но когда я устанавливаю JTable Auto Resizeable, он не будет иметь горизонтальную полосу прокрутки.
если я устанавливаю AUTO_RESIZE_OFF, тогда Jtable не будет заполнять ширину своего контейнера, когда ширина столбца недостаточно велика.
Итак, как я могу это сделать:
- когда таблица недостаточно широка, разверните ее, чтобы заполнить ее ширину контейнера
- когда таблица достаточно широка, сделайте ее прокручиваемой.
Спасибо
Ответы
Ответ 1
Вам нужно настроить поведение интерфейса 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);
}
}
В приведенном выше коде в основном размер компонента с его предпочтительным размером или размером окна просмотра, в зависимости от того, что больше.
Ответ 2
Если по какой-то причине настройка 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);
}
}
});
Ответ 3
Я обнаружил, что все, что нужно, это включить
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));
Ответ 4
Если вы установите макет своего контейнера BorderLayout с BorderLayout.CENTER, тогда JTable автоматически изменит размер, чтобы соответствовать его контейнеру.
Если вы хотите сделать прокручиваемый компонент, вы можете обернуть JTable с помощью JScrollPane.
setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);