Jak zrobić JTable zarówno AutoSize jak i horizontall scrollable?

Wstawiam JTable do jscrollpane

Ale kiedy ustawię JTable Auto Resizeable, wtedy nie będzie miał poziomego paska przewijania.

Jeśli ustawię AUTO_RESIZE_OFF, to Jtable nie wypełni szerokości kontenera, gdy szerokość kolumny nie jest wystarczająco duża.

Więc jak Mogę to zrobić:

  1. gdy tabela nie jest wystarczająco szeroka, rozwiń, aby wypełnić jej szerokość kontenera
  2. gdy stół jest wystarczająco szeroki, należy go przewijać.

Thanks

Author: Leon, 2011-05-24

4 answers

Musisz dostosować zachowanie przewijanego interfejsu.

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

Powyższy kod zasadniczo dopasowuje komponent do jego preferowanego rozmiaru lub rozmiaru widoku, w zależności od tego, która z tych wartości jest większa.

 35
Author: camickr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 01:48:50

Jeśli z jakiegoś powodu dostosowywanie JTable nie jest opcją (np. może być utworzone w kodzie innej firmy), możesz osiągnąć ten sam wynik, ustawiając przełączanie między dwoma różnymi trybami AUTO_RESIZE JTable, gdy tylko zmieni się rozmiar widoku, np.:

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);
        }
    }
});
 9
Author: gb96,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 22:11:34

Odkryłem, że wszystko, co jest potrzebne, to dołączyć

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

A następnie po obliczeniu wymaganej szerokości i wysokości viewport, include

  frame.getContentPane().add(new JScrollPane(table))
  table.setPreferredScrollableViewportSize(new Dimension(width,height));
 2
Author: Nick Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 06:21:41

Jeśli ustawisz układ kontenera na BorderLayout z BorderLayout.CENTER ograniczenie układu, wtedy JTable automatycznie zmieni rozmiar, aby dopasować go do swojego kontenera.

Jeśli chcesz, aby komponent był przewijalny, możesz zawinąć JTable za pomocą JScrollPane .

setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);
 0
Author: Mohamed Mansour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 01:46:29