web-dev-qa-db-ja.com

JTableを自動サイズ調整と水平方向にスクロール可能にする方法

JTableをJScrollPaneに入れています

ただし、JTable Auto Resizeableを設定すると、水平スクロールバーがなくなります。

aUTO_RESIZE_OFFを設定すると、列幅が十分に大きくない場合、Jtableはコンテナの幅を埋めません。

どうすればこれを行うことができます:

  1. テーブルの幅が十分でない場合は、コンテナの幅に合わせて拡大します
  2. テーブルが十分に広い場合は、スクロール可能にします。

ありがとう

25
Leon

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

上記のコードは基本的に、推奨サイズまたはビューポートサイズのいずれか大きい方でコンポーネントのサイズを変更します。

38
camickr

何らかの理由でJTableのカスタマイズがオプションではない場合(たとえば、サードパーティのコードで作成される場合)、ビューポートのサイズが変更されるたびに2つの異なる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);
        }
    }
});
9
gb96

必要なのは含めることだけだとわかりました

  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));
2
Nick Thomas

コンテナのレイアウトを BorderLayout.CENTER レイアウト制約で BorderLayout に設定すると、JTableはコンテナに合わせて自動サイズ変更されます。

コンポーネントをスクロール可能にする場合、JTableを JScrollPane でラップできます。

setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);
0
Mohamed Mansour