【发布时间】:2013-03-08 02:43:28
【问题描述】:
我在创建带有滚动条的 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";
}
}
}
【问题讨论】:
-
覆盖 scrollableTracksViewportWidth 不应该对列的可调整性有任何影响。您的任何代码是否在操作第一个 TableColumn 的 minWidth、maxWidth 或 resizable 属性?
-
不,没有代码可以操纵它。有一个 AbstractTableModel 需要一个值列表来填充表。此外,表格被包裹在一个 JScrollPane 中,就是这样。
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
看到你的编辑:在 JXTable 中不支持 - 当缩小第一列时,其他列被扩展,将它们缩小到初始大小将需要额外的逻辑(不确定这会有多困难,调整大小逻辑在很大程度上是一个黑盒子)
标签: java swing jtable jscrollpane