📄 tablechecker.java
字号:
package com.zcsoft.swing;
/*
* Title: 通用类
* Description: 为公司软件开发提供基本公用工具类
* Copyright: Copyright (c) 2002
* Company: 苏州至诚软件业服务有限公司
* @author 蒋智湘
* @version 1.0
*/
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.event.*;
import javax.swing.ListSelectionModel;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* 表格行选择状态同控件可用性绑定检查器
* 所绑定的控件的enable属性值是否为true同表格中是否有选择行有关;
* 如果没有选择取行,则所绑定的控件的enable属性值一定为false
*/
public final class TableChecker
implements TextFieldGroup.Checker
, ListSelectionListener
, PropertyChangeListener
, TableModelListener
{
/** 判定是否有行被选择的表格 */
private JTable proxy;
private TextFieldGroup tfg;
/**
* @param table 判定是否有行被选择的表格
* @param tfg 想添加该类型检查的数据输入有效性检查器。
* 构造该类的实例后,在tfg上添加了表格是否有选择行的检查。
* 即调用了tfg.addChecker(this)
*
* @exception NullPointerException table or tfg is null
*/
private TableChecker(JTable table, TextFieldGroup tfg)
{
if (table == null || tfg == null)
{
throw new NullPointerException("table or tfg is null");
}
initTable(table);
proxy = table;
tfg.addChecker(this);
this.tfg = tfg;
}
/**
* @param table 判定是否有行被选择的表格
* @param controls 行选择状态所影响的控件可用性的那些控件
*
* @exception NullPointerException table or controls is null
* @exception IllegalArgumentException controls.length < 1
*/
public TableChecker(JTable table, Component controls[])
{
if (table == null || controls == null)
{
throw new NullPointerException("table or controls is null");
}
if (controls.length < 1)
{
throw new IllegalArgumentException("controls is empty");
}
initTable(table);
proxy = table;
this.tfg = new TextFieldGroup((javax.swing.JComponent[])null, controls);;
this.tfg.addChecker(this);
}
/**
* 添加表格上行选择事件的侦听
*/
private void initTable(JTable t)
{
t.getSelectionModel().addListSelectionListener(this);
t.getModel().addTableModelListener(this);
t.addPropertyChangeListener("selectionModel", this);
t.addPropertyChangeListener("model", this);
}
/**
* TextFieldGroup.Checker接口方法实现。如果当前没有选择行,返回false,
* 否则,返回true
*/
public boolean toSetEnabled()
{
return proxy.getSelectedRow() >= 0//如此判断更加准确
&& proxy.getSelectedRow() < proxy.getRowCount();
}
/**
* 纠正bug。当原选择行全部被删除时,并不会调用clearSelection()方法去触发
* ListSelectionEvent事件
*/
public void tableChanged(TableModelEvent e)
{
if (e != null &&
e.getType() == TableModelEvent.DELETE)
{
//由于表格数据模型事件的响应顺序是Last added first service机制
//所以不能依赖别的事件侦听实现去完成removeIndexInterval的调用
//从而根据调用后,表格的行选择状态进行后续判断
proxy.getSelectionModel().removeIndexInterval(e.getFirstRow(), e.getLastRow());
if (proxy.getSelectedRow()==-1)
{
tfg.check();
}
}
}
/**
* 表格的选择模型/数据模型是否改变。如果改变则更改事件侦听。
* 老的删除,新的加上
*/
public void propertyChange(PropertyChangeEvent evt)
{
//old or new should not be null
Object old = evt.getOldValue();
if (old instanceof ListSelectionModel)
{
((ListSelectionModel)old).removeListSelectionListener(this);
((ListSelectionModel)evt.getNewValue()).addListSelectionListener(this);
}
else if (old instanceof TableModel)
{
((TableModel)old).removeTableModelListener(this);
((TableModel)evt.getNewValue()).addTableModelListener(this);
}
tfg.check();
}
/**
* 选择行一变化就检查
*/
public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting())
{
tfg.check();
}
}
/**
* 将指定表格的数据行的选中状态同指定控件的可使用状态绑定在一起,
* 使得在表格中的没有选中行的情况下,那些控件不可使用。
* @param table判定是否有行被选择的表格
* @param controls 行选择状态所影响的控件可用性的那些控件
* @return TextFieldGroup 对象
* @exception NullPointerException table or controls is null
* @exception IllegalArgumentException controls.length < 1
*/
public static TextFieldGroup bindTable(JTable table, Component controls[])
{
return new TableChecker(table, controls).tfg;
}
/**
* 将指定表格的数据行的选中状态同{@link TextFieldGroup}实例中的帮定控件的可使用状态绑定在一起
* 这种情况一般出现用于某些组件的可用状态既与文本组件有无文本内容相关,
* 也同表格中是否存在被选中的数据行状态相关的情形。
* @param tfg 已经构造好了的TextFieldGroup对象
* @param table 附加检查其数据行是否选中的表格对象
*/
public static void bindTable(TextFieldGroup tfg, JTable table)
{
new TableChecker(table, tfg);
}
/*
* 测试示例
*
static public void main(String[] args)
{
javax.swing.JFrame frame = new javax.swing.JFrame("测试");
javax.swing.JButton btn = new javax.swing.JButton("go");
javax.swing.JComponent tf[] = new javax.swing.JComponent[3];
int i=0;
for (; i < tf.length-1; i++)
{
tf[i]=new ZCIntTextField((i+2)*10, 200, 6);
frame.getContentPane().add(tf[i]);
}
tf[i] = new javax.swing.JComboBox(new Object[]{"as", "dfgs"});
final RWTableModel tm = new RWTableModel(20, 10);
final JTable table = new OrderableTable(tm);
frame.getContentPane().add(new javax.swing.JScrollPane(table));
frame.getContentPane().add(btn, java.awt.BorderLayout.SOUTH);
javax.swing.JButton chageState = new javax.swing.JButton(new javax.swing.AbstractAction("change")
{
public void actionPerformed(java.awt.event.ActionEvent e)
{
tm.setNumRows(0);
}
});
frame.getContentPane().add(chageState, java.awt.BorderLayout.NORTH);
new TableChecker(table, new Component[]{btn});
frame.pack();
frame.setLocation(300,300);
frame.show();
}//*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -