我在创建带滚动条的JTable时遇到了问题。我想要一个有两列且没有可见滚动条的JTable。
如果我放大其中一列,滚动条应该变为可见状态并且列会自动调整大小。
我按照这篇答案(如何使JTable既可以自适应又可以水平滚动)来实现,这基本上是:
JTable table = new JTable() {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
然而,使用此解决方案,我无法缩小第一列。只有当我扩大第二列并滚动条变得可见时,我才能缩小第一列。
所需的行为是使两个列自动可调整大小。也就是说,第一列可以缩小、延伸而不会弹出滚动条。只有在扩展其中一个列,以便视图应该扩展时,滚动条才会弹出。
一个场景:
- 缩小第一列->第二列变大,没有滚动条
- 放大第一列->第二列变小,仍然没有滚动条
- 放大第二列->第一列保持不变,第二列变大且滚动条出现
有什么修复的想法吗?
一个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";
}
}
}