chi*_*llx 5 java swing jtable jscrollpane
我在使用滚动条创建JTable时遇到问题.我想要一个有2列且没有可见滚动条的JTable.
如果我放大其中一列,则滚动条应该变为可见,并且列会调整大小.
我按照这个答案如何使JTable同时AutoResize和horizontall可滚动?并且工作正常,基本上归结为:
JTable table = new JTable() {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
Run Code Online (Sandbox Code Playgroud)
但是,使用此解决方案,我无法收缩第一列.只有当我放大第二列并且滚动条变得可见时,我才能缩小第一列.
所需的行为是2列可自动调整大小.这意味着1列可以缩小,然后在没有滚动条弹出的情况下延伸.仅当扩展其中一列时,视图应该延伸,才会弹出滚动条.
场景:
有关修复此问题的任何想法
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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
覆盖getTracks方法还不够,如果跟踪,你必须愚弄super的布局做正确的事情:
JTable myTable = new JTable(10, 4) {
private boolean inLayout;
@Override
public boolean getScrollableTracksViewportWidth() {
return hasExcessWidth();
}
@Override
public void doLayout() {
if (hasExcessWidth()) {
// fool super
autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
}
inLayout = true;
super.doLayout();
inLayout = false;
autoResizeMode = AUTO_RESIZE_OFF;
}
protected boolean hasExcessWidth() {
return getPreferredSize().width < getParent().getWidth();
}
@Override
public void columnMarginChanged(ChangeEvent e) {
if (isEditing()) {
// JW: darn - cleanup to terminate editing ...
removeEditor();
}
TableColumn resizingColumn = getTableHeader().getResizingColumn();
// Need to do this here, before the parent's
// layout manager calls getPreferredSize().
if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
&& !inLayout) {
resizingColumn.setPreferredWidth(resizingColumn.getWidth());
}
resizeAndRepaint();
}
};
Run Code Online (Sandbox Code Playgroud)
可能还没有完全完成(可能仍然没有,即使在编辑之后处理columnMarginChanged,从JXTable(SwingX项目)复制,通过额外的布局属性支持该行为)
xTable.setHorizontalScrollEnabled(true);
Run Code Online (Sandbox Code Playgroud)