我有一个使用TableColumnModelListener()
来检测列是否已经被调整大小的JTable,并且我有一些想要在columnMarginChanged()
方法中执行的代码。
如何确定该列是由用户调整大小还是由其他代码引起的?
我认为我必须从ChangeEvent.getSource()
开始,但我不知道接下来该如何操作。
谢谢。
我有一个使用TableColumnModelListener()
来检测列是否已经被调整大小的JTable,并且我有一些想要在columnMarginChanged()
方法中执行的代码。
如何确定该列是由用户调整大小还是由其他代码引起的?
我认为我必须从ChangeEvent.getSource()
开始,但我不知道接下来该如何操作。
谢谢。
我可以给你一个可能的方案。我曾尝试解决同样的问题,因为我想将关于列宽的信息序列化到磁盘上,以便下次在我的应用程序中打开表格时,可以恢复适当的列宽。具体步骤如下:
第一步 - 重写JTable并添加一个布尔属性
class MyTable extends JTable {
private boolean isColumnWidthChanged;
public boolean getColumnWidthChanged() {
return isColumnWidthChanged;
}
public void setColumnWidthChanged(boolean widthChanged) {
isColumnWidthChanged = widthChanged;
}
}
步骤2 - 将TableColumnModelListener()添加到表格中
private class TableColumnWidthListener implements TableColumnModelListener
{
@Override
public void columnMarginChanged(ChangeEvent e)
{
/* columnMarginChanged is called continuously as the column width is changed
by dragging. Therefore, execute code below ONLY if we are not already
aware of the column width having changed */
if(!tableObj.hasColumnWidthChanged())
{
/* the condition below will NOT be true if
the column width is being changed by code. */
if(tableObj.getTableHeader.getResizingColumn() != null)
{
// User must have dragged column and changed width
tableObj.setColumnWidthChanged(true);
}
}
}
@Override
public void columnMoved(TableColumnModelEvent e) { }
@Override
public void columnAdded(TableColumnModelEvent e) { }
@Override
public void columnRemoved(TableColumnModelEvent e) { }
@Override
public void columnSelectionChanged(ListSelectionEvent e) { }
}
第三步 - 在表头中添加鼠标监听器
private class TableHeaderMouseListener extends MouseAdapter
{
@Override
public void mouseReleased(MouseEvent e)
{
/* On mouse release, check if column width has changed */
if(tableObj.getColumnWidthChanged())
{
// Do whatever you need to do here
// Reset the flag on the table.
tableObj.setColumnWidthChanged(false);
}
}
}
注意:在我的应用程序中,TableHeaderMouseListener和TableColumnWidthListener类是我的主应用程序类的私有内部类。我的主应用程序类持有对被观察的表的引用。因此,这些内部类可以访问表实例。显然,根据您的设置,您需要采取适当的措施将表实例提供给这些其他类。希望这能有所帮助!
interface SGridModel {
public void columnMoved(int oldLocation, int newLocation);
public void columnResized(int column, int newWidth);
}
class SColumnListener extends MouseAdapter implements TableColumnModelListener {
private final Logger log = Logger.getLogger(getClass());
private final SGridModel model;
private int oldIndex = -1;
private int newIndex = -1;
private boolean dragging = false;
private boolean resizing = false;
private int resizingColumn = -1;
private int oldWidth = -1;
SColumnListener(SGridModel model){
this.model = model;
}
@Override
public void mousePressed(MouseEvent e) {
// capture start of resize
if(e.getSource() instanceof JTableHeader) {
TableColumn tc = ((JTableHeader)e.getSource()).getResizingColumn();
if(tc != null) {
resizing = true;
resizingColumn = tc.getModelIndex();
oldWidth = tc.getPreferredWidth();
} else {
resizingColumn = -1;
oldWidth = -1;
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
// column moved
if(dragging && oldIndex != newIndex) {
model.columnMoved(oldIndex, newIndex);
log.info("column moved: " +oldIndex+" -> "+newIndex);
}
dragging = false;
oldIndex = -1;
newIndex = -1;
// column resized
if(resizing) {
if(e.getSource() instanceof JTableHeader) {
TableColumn tc = ((JTableHeader)e.getSource()).getColumnModel().getColumn(resizingColumn);
if(tc != null) {
int newWidth = tc.getPreferredWidth();
if(newWidth != oldWidth) {
model.columnResized(resizingColumn, newWidth);
log.info("column resized: " +resizingColumn+" -> "+newWidth);
}
}
}
}
resizing = false;
resizingColumn = -1;
oldWidth = -1;
}
@Override
public void columnAdded(TableColumnModelEvent e) {
}
@Override
public void columnRemoved(TableColumnModelEvent e) {
}
@Override
public void columnMoved(TableColumnModelEvent e) {
// capture dragging
dragging = true;
if(oldIndex == -1){
oldIndex = e.getFromIndex();
}
newIndex = e.getToIndex();
}
@Override
public void columnMarginChanged(ChangeEvent e) {
}
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
}
}
table.getColumnModel().addColumnModelListener(cl);
table.getTableHeader().addMouseListener(cl);
getTableHeader().addMouseListener( new MouseAdapter() {
public void mouseReleased(MouseEvent arg0)
{
String colNamesAndSizes = "";
for( int i=0;i<getColumnModel().getColumnCount();i++ ) {
if( i>0 ) colNamesAndSizes += ",";
TableColumn column = getColumnModel().getColumn(i);
colNamesAndSizes += column.getHeaderValue();
colNamesAndSizes += ":";
colNamesAndSizes += column.getWidth();
}
// check if changed, if yes, persist...
}});