我在创建带有滚动条的 JTable 时遇到问题。我想要一个有 2 列且没有可见滚动条的 JTable。
如果我放大其中一列,滚动条应该变得可见并且列调整大小。
我遵循了这个答案How to make JTable both AutoResize and Horizontall scrollable? 并且工作正常,这基本上归结为:
JTable table = new JTable() {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
但是,使用此解决方案,我无法缩小第一列。只有当我放大第二列并且滚动条变得可见时,我才能缩小第一列。
所需的行为是 2 列可自动调整大小。这意味着 1 列可以缩小,然后在没有滚动条弹出的情况下扩展。仅当扩展其中一列以使视图扩展时,滚动条才会弹出。
一个场景:
- 缩小第一列->第二列放大,没有滚动条
- 放大第一列->第二列缩小,仍然没有滚动条
- 放大第 2 列 -> 1 列保持不变,第 2 列放大并出现滚动条
关于解决这个问题的任何想法?
SSCCE:
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.Container;
public class TableTest {
public TableTest() {
JDialog mainDialog = new JDialog();
mainDialog.setResizable( true );
mainDialog.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
Container contentPane = mainDialog.getContentPane();
JTable myTable = new JTable() {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
myTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
myTable.setModel( new MyTableModel() );
JScrollPane scrollPane = new JScrollPane( myTable );
contentPane.add( scrollPane, BorderLayout.CENTER );
mainDialog.pack();
mainDialog.setVisible( true );
}
public static void main( String[] args ) {
new TableTest();
}
private class MyTableModel extends AbstractTableModel {
@Override public int getRowCount() {
return 1;
}
@Override public int getColumnCount() {
return 2;
}
@Override public Object getValueAt( int rowIndex, int columnIndex ) {
return "ARandomValue";
}
}
}