JTableをJScrollPaneに入れています
ただし、JTable Auto Resizeableを設定すると、水平スクロールバーがなくなります。
aUTO_RESIZE_OFFを設定すると、列幅が十分に大きくない場合、Jtableはコンテナの幅を埋めません。
どうすればこれを行うことができます:
ありがとう
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);
}
}
上記のコードは基本的に、推奨サイズまたはビューポートサイズのいずれか大きい方でコンポーネントのサイズを変更します。
何らかの理由で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);
}
}
});
必要なのは含めることだけだとわかりました
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));
コンテナのレイアウトを BorderLayout.CENTER レイアウト制約で BorderLayout に設定すると、JTableはコンテナに合わせて自動サイズ変更されます。
コンポーネントをスクロール可能にする場合、JTableを JScrollPane でラップできます。
setLayout(new BorderLayout());
add(new JScrollPane(new JTable()), BorderLayout.CENTER);